std::unique_ptr::reset 检查托管指针是否无效?

2024-02-04

我一直在阅读有关 C++11 智能指针的内容,以便在我的源代码中使用它们,我一直在阅读的文档是 cppreference.com 上的文档;在阅读有关std::unique_ptr,在reset功能 http://en.cppreference.com/w/cpp/memory/unique_ptr/reset有一个文档对我来说似乎不正确(强调我的):

替换被管理的对象。

  • Given 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 删除(强调我的):

如果操作数的值删除表达式不是空指针值,则:

— 如果未省略对要删除的对象的 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(使用前将#替换为@)

std::unique_ptr::reset 检查托管指针是否无效? 的相关文章

随机推荐