c – 为什么带有自定义删除器的unique_ptr对于nullptr不起作用,
使用unique_ptr或shared_ptr作为范围保护的简单代码.有关清除内容的所有信息都在删除器中捕获,因此我尽管将nullptr用于构造函数是安全的.
显然,使用Visual C 2017(14.1),它不能像unique_ptr那样工作,但适用于shared_ptr.这是微软的怪癖,还是标准阻止在持有nullptr时调用unique_ptr的删除? 在下面的代码中,我被迫用(void *)1构造一个unique_ptr.如果我使用nullptr构造它,则不会调用cleaner.对于shared_ptr,没有区别,总是调用清理器. #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 << "donen"; return 0; } 解决方法
unique_ptr的析构函数需要这样做:
实际上shared_ptr的析构函数需要执行相同的操作:
所以依靠智能指针在传递空指针时在范围出口执行任意操作是不可靠的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |