我们最近在使用自定义删除器从unique_ptr转到shared_ptr时遇到了一个崩溃.当用于创建智能指针的指针为空时,发生崩溃.以下是重现问题的代码,并显示两种情况.
在下面的源代码中,One和Two运行愉快,而“ReleaseDestroy”中的三个崩溃.当智能指针中使用的类具有虚拟“释放”时,崩溃似乎正在发生,因此程序正在尝试查找V-Table. unique_ptr看起来像检查空指针并且不运行析构函数.共享指针似乎忽略了这一点.
有人知道这是否是设计,还是stl实现中的错误?我们正在使用Visual Studio 2015.
#include <iostream> #include <memory> template<class R> void ReleaseDestroy(R* r) { r->Release(); }; class FlatDestroy { public : void Release() { delete this; } }; class VirtualDestroy { public: virtual void Release() { delete this; } }; class SimpleOne { public : }; void main() { std::shared_ptr<SimpleOne> One(nullptr); std::shared_ptr<FlatDestroy> Two(nullptr,ReleaseDestroy<FlatDestroy>); std::shared_ptr<VirtualDestroy> Three(nullptr,ReleaseDestroy<VirtualDestroy>); One.reset(); Two.reset(); Three.reset(); }