Pap*_*ter 5 c++ unique-ptr language-lawyer delete-operator c++11
我一直在阅读有关C++ 11智能指针的内容,以便在我的源代码中使用它们,我一直在阅读的文档是cppreference.com上的文档; 一边念叨的std::unique_ptr,对reset功能有,似乎不正确的我(重点煤矿)的一个文档:
替换托管对象.
给定
current_ptr,由其管理的指针按*this以下顺序执行以下操作:
- 保存当前指针的副本
old_ptr = current_ptr.- 用参数覆盖当前指针
current_ptr = ptr.- 如果旧指针非空,则删除以前管理的对象
if(old_ptr != nullptr) get_deleter()(old_ptr).
在C++标准文档中,我们可以读取众所周知的删除空指针功能:
从n3690标准5.3.5删除(强调我的):
如果delete-expression的操作数的值不是空指针值,则:
- 如果没有省略要删除的对象的new-expression的分配调用,则delete-expression应调用deallocation函数.从new-expression的分配调用返回的值应作为第一个参数传递给deallocation函数.
- 否则,delete-expression不会调用deallocation函数.
所以,我想知道为什么cppreference说该unique_ptr::reset函数在删除之前检查托管指针的无效性,即使te标准表示不会通过空指针调用解除分配函数(这就是为什么cppreference文档对我来说似乎不正确) .
很明显,我必须弄错,必须有理由以这种方式做事,但我无法想象它可能是什么原因.任何提示?
PS:标准中的哪些部分定义了std::unique_ptr必须如何实施或表现?在20.9.1类模板中,unique_ptr我找不到任何关于check-for-nullity的东西.
是的,标准(C++ 11,[unique.ptr.single.modifiers]§4)需要检查非null :
Run Code Online (Sandbox Code Playgroud)void reset(pointer p = pointer()) noexcept;4效果:分配
p给存储的指针,然后如果old_pnullptrget_deleter()(old_p)存储的指针的旧值不等于,则调用.[ 注意:这些操作的顺序很重要,因为对get_deleter()的调用可能会破坏*this.- 尾注 ]
(强调我的)
讨论:标准化它的另一种方法是将"负担"放在类的用户身上,即要求所有删除器(默认的和任何自定义的)在空指针上调用时工作正常.
但是,我理解这个想法是启用类似函数free()甚至像假设这样的函数unlock_mutex(Mutex*)作为开箱即用的删除程序,无论它们如何处理空指针.因此,将此检查放入unique_ptr其中可以扩大可以直接使用的删除器的选择范围.