![](/img/trans.png)
[英]Why does unique_ptr have the deleter as a type parameter while shared_ptr doesn't?
[英]Why unique_ptr with custom deleter won't work for nullptr, while shared_ptr does?
使用unique_ptr
或shared_ptr
作为范围保护的简单代码。 有关清除内容的所有信息都在deleter
捕获,因此我尽管将nullptr
用于构造函数是安全的。
显然,使用Visual C ++ 2017(14.1),它不能像unique_ptr
那样工作,但适用于shared_ptr
。 这是微软的怪癖,还是标准阻止在持有nullptr
时调用unique_ptr
的deleter
?
在下面的代码中,我被迫用(void*)1
构造一个unique_ptr
。 如果我使用nullptr
构造它,则不会调用cleaner
。 对于shared_ptr
,没有区别,总是调用cleaner
。
#include <memory>
#include <iostream>
int main()
{
int ttt = 77;
auto cleaner = [&ttt](void*) {
std::cout << "cleaner: " << ttt << "\n"; // do something with capture here instead of print
};
std::unique_ptr<void, decltype(cleaner)> p((void*)1, cleaner);
std::shared_ptr<void> q(nullptr, [&ttt](void*) {
std::cout << "shared: " << ttt << "\n"; // do something with capture here instead of print
});
std::cout << "done\n";
return 0;
}
unique_ptr
的析构函数需要这样做:
23.11.1.2.2 unique_ptr析构函数[unique.ptr.single.dtor]
2效果:如果
get() == nullptr
没有效果。 否则get_deleter()(get())
。
实际上shared_ptr
的析构函数需要执行相同的操作:
23.11.2.2.2 shared_ptr析构函数[util.smartptr.shared.dest]
- (1.1)如果
*this
为空或与另一个shared_ptr
实例共享所有权(use_count() > 1
),则没有副作用。- (1.2)否则,如果
*this
拥有对象p和删除器d,则调用d(p)。
所以依靠智能指针在传递空指针时在范围出口执行任意操作是不可靠的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.