我们最近在使用自定义删除工具从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();
}