使用unique_ptr
或shared_ptr
作为范围保护的简单代码。有关清除内容的所有信息都在deleter
中捕获,因此我使用nullptr
作为构造函数是安全的。
显然,使用Visual C ++ 2017(14.1)时,unique_ptr
的效果不如预期,但适用于shared_ptr
。这是微软的怪癖,还是标准阻止在持有deleter
时调用unique_ptr
的{{1}}?
在下面的代码中,我被迫用nullptr
构建unique_ptr
。如果我使用(void*)1
构建它,则不会调用nullptr
。对于cleaner
,没有区别,始终会调用shared_ptr
。
cleaner
答案 0 :(得分:6)
enable_shared_from_this
要求析构函数执行此操作:
23.11.1.2.2 unique_ptr析构函数[unique.ptr.single.dtor]
2效果:如果
unique_ptr
没有效果。否则get() == nullptr
。
实际上get_deleter()(get())
的析构函数需要执行相同的操作:
23.11.2.2.2 shared_ptr析构函数[util.smartptr.shared.dest]
- (1.1)如果
shared_ptr
为空或与另一个*this
实例(shared_ptr
)共享所有权,则没有副作用。- (1.2)否则,如果
use_count() > 1
拥有对象p和删除者d,则调用d(p)。
因此,在传递空指针时依赖智能指针在范围出口执行任意操作是不可靠的。