为什么带有自定义删除器的unique_ptr对于nullptr不起作用,而shared_ptr呢?

时间:2018-05-06 16:26:17

标签: c++ c++11 visual-c++ language-lawyer

使用unique_ptrshared_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

1 个答案:

答案 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)。

因此,在传递空指针时依赖智能指针在范围出口执行任意操作是不可靠的。