我一直在阅读有关 C++11 智能指针的内容,以便在我的源代码中使用它们,我一直在阅读的文档是 cppreference.com 上的文档;在阅读有关std::unique_ptr
,在reset功能 http://en.cppreference.com/w/cpp/memory/unique_ptr/reset有一个文档对我来说似乎不正确(强调我的):
替换被管理的对象。
在C++标准文档中,我们可以读到众所周知的删除空指针功能:
摘自n3690
标准5.3.5 删除(强调我的):
如果操作数的值删除表达式不是空指针值,则:
— 如果未省略对要删除的对象的 new 表达式的分配调用,则删除表达式应调用释放函数。从 new 表达式的分配调用返回的值应作为第一个参数传递给释放函数。
— 否则,删除表达式不会调用释放函数.
所以,我想知道为什么 cppreference 说unique_ptr::reset
函数在删除之前检查托管指针的空性,即使标准规定不会通过空指针调用任何释放函数(这就是为什么 cppreference 文档对我来说似乎不正确)。
很明显,我一定是弄错了,而且一定有一个理由这样做,但我无法想象这可能是什么原因。有什么提示吗?
PS:标准中如何定义std::unique_ptr
必须执行或表现?在里面20.9.1 类模板unique_ptr
我找不到任何关于检查无效性 stuff.
是的,标准要求检查非空(C++11、[unique.ptr.single.modifiers]§4
):
void reset(pointer p = pointer()) noexcept;
4 效果:分配p
到存储的指针,然后如果存储指针的旧值,old_p
, 不等于nullptr
, calls get_deleter()(old_p)
. [ Note:这些操作的顺序很重要,因为调用 get_deleter() 可能会破坏*this
. ——尾注 ]
(强调我的)
讨论:标准化的另一种方法是将“负担”放在类的用户身上,即要求所有删除器(默认删除器)and任何自定义的)在空指针上调用时都能正常工作。
但是,我理解这个想法是启用诸如free()
甚至像假设的事情unlock_mutex(Mutex*)
作为开箱即用的删除器,无论它们如何/是否处理空指针。所以把这张支票放入unique_ptr
其本身拓宽了可直接使用的删除器的选择范围。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)