【发布时间】:2014-02-06 14:48:36
【问题描述】:
我一直在阅读有关 C++11 智能指针的信息,以便在我的源代码中使用它们,我一直在阅读的文档是 cppreference.com 上的文档;在阅读std::unique_ptr 时,reset function 上有一个对我来说似乎不正确的文档(强调我的):
替换托管对象。
给定
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的操作数的值不是空指针值,那么:
——如果对要删除的对象的新表达式的分配调用没有省略,delete-expression 将调用一个释放函数。从 new-expression 的分配调用返回的值应作为第一个参数传递给释放函数。
— 否则,delete-expression不会调用释放函数。
所以,我想知道为什么 cppreference 说 unique_ptr::reset 函数在删除托管指针之前检查它的空值,即使标准说不会通过空指针调用释放函数(这就是 cppreference文档对我来说似乎不正确)。
很明显,我一定是弄错了,这样做肯定是有原因的,但我无法想象这可能是什么原因。有什么提示吗?
PS:标准中的哪里定义了std::unique_ptr 必须如何实现或表现?在 20.9.1 类模板 unique_ptr 中,我找不到任何关于 check-for-nullity 的内容。
【问题讨论】:
-
delete并不是摆脱类指针资源的唯一方法。你可以有一个自定义删除器frees 或做其他不喜欢空指针的事情。
标签: c++ c++11 language-lawyer unique-ptr delete-operator