shared_ptr陌生性,带有零值和自定义deleter

shared_ptr strangeness with null values and custom deleter

本文关键字:deleter 自定义 ptr shared      更新时间:2023-10-16

我们最近使用自定义deleter从solution_ptr移动到共享_ptr时遇到了崩溃。崩溃发生在用于创建智能指针的指针为无效时。以下是复制问题的代码,并显示了两个有效的情况。

在下面的来源中,一个和两个愉快地运行,而"释放"中的三起坠毁。当智能指针中使用的类具有虚拟"发行"时,崩溃似乎正在发生,因此该程序正在尝试查找V台。unique_ptr看起来像是检查无效指针,并且不运行驱动器。共享的指针似乎忽略了这一点。

有人知道这是通过设计而知道的,还是STL实现中的错误?我们正在使用Visual Studio2015。

#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();
}

unique_ptrshared_ptr的破坏行为不同:

  • unique_ptr仅在持有指针的情况下拨打deleter。

  • shared_ptr总是调用deleter。

因此,您的共享指针deleter 必须能够处理空指针值!例如, std::free很好,但是 std::fclose却不是,您的deleter也不是(因为它无条件地删除了r)。

顺便说一句,这是在LWG 2415中进行的,该问题涉及从独特的指针中构建共享指针,该指针在该缺陷分辨率之前被打破了,正是出于这个原因。(我自己在这里遇到了这个问题;请注意该代码如何小心以区分shared_ptr的空案例。)