首页 > 解决方案 > 为什么在“delete shared_ptr::get()”中使用时删除会触发错误

问题描述

假设我有以下代码:

#include <memory>
struct Foo{};

int main()
{
    std::shared_ptr<Foo> pf = std::make_shared<Foo>();
    delete pf.get();
    //do anything else
    return 0;
}

为什么我不能delete直接使用deleteFoo对象?在我看来,问题是智能指针析构后,delete会被调用两次,导致未定义的行为。但是为什么我第一次手动使用时会触发错误. 我很困惑,请帮助我。

而且我发现在visual studio中的返回值和真实对象的get()分配地址是一样的。如下:Foonew

template<class... _Types>
        explicit _Ref_count_obj(_Types&&... _Args)
        : _Ref_count_base()
        {   // construct from argument list
        ::new (static_cast<void *>(&_Storage)) _Ty(_STD forward<_Types>(_Args)...);
        }

标签: c++11

解决方案


正确的解释是你没有通过 获得指针new,因此调用delete它是未定义的行为,编译器可以做任何它想做的事情。

你甚至不应该超越这一点。

实现细节答案(如有更改,恕不另行通知,编译器版本甚至编译开关之间的结果可能会有所不同)是make_shared在单个分配中分配引用计数控制块和对象,然后为您提供指向此分配的指针。由于控制块通常会在对象之前分配,这意味着您交给的内存地址delete不是从内存分配器返回的地址。


推荐阅读