std :: unique_ptr :: reset检查托管指针的无效性?

Pap*_*ter 5 c++ unique-ptr language-lawyer delete-operator c++11

我一直在阅读有关C++ 11智能指针的内容,以便在我的源代码中使用它们,我一直在阅读的文档是cppreference.com上的文档; 一边念叨的std::unique_ptr,对reset功能有,似乎不正确的我(重点煤矿)的一个文档:

替换托管对象.

  • 给定current_ptr,由其管理的指针按*this以下顺序执行以下操作:

    1. 保存当前指针的副本old_ptr = current_ptr.
    2. 用参数覆盖当前指针current_ptr = ptr.
    3. 如果旧指针非空,则删除以前管理的对象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的东西.

Rei*_*ica 6

是的,标准(C++ 11,[unique.ptr.single.modifiers]§4)需要检查非null :

void reset(pointer p = pointer()) noexcept;
Run Code Online (Sandbox Code Playgroud)

4效果:分配p给存储的指针,然后如果old_pnullptrget_deleter()(old_p)存储的指针的旧值不等于,则调用.[ 注意:这些操作的顺序很重要,因为对get_deleter()的调用可能会破坏*this.- 尾注 ]

(强调我的)

讨论:标准化它的另一种方法是将"负担"放在类的用户身上,即要求所有删除器(默认的任何自定义的)在空指针上调用时工作正常.

但是,我理解这个想法是启用类似函数free()甚至像假设这样的函数unlock_mutex(Mutex*)作为开箱即用的删除程序,无论它们如何处理空指针.因此,将此检查放入unique_ptr其中可以扩大可以直接使用的删除器的选择范围.

  • @PaperBirdMaster如果删除器不是默认删除器,并且不使用空指针怎么办? (3认同)
  • @PaperBirdMaster是的,那将是标准采取的替代路线.但我理解这个想法是启用像`free()`这样的函数,甚至像假设的`unlock_mutex(Mutex*)`这样的东西就像开箱即用的删除器一样,所以他们决定把负担放在`unique_ptr上`而不是它的用户. (2认同)