为什么这个“std::shared_ptr<>”托管对象会泄漏?

Too*_*sie 2 c++ shared-ptr c++11

#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class test : public enable_shared_from_this<test> {
    vector<shared_ptr<test>> vec;
public:

    void addvec()
    {
        vec.emplace_back(shared_from_this());
    }
    ~test() { cout << "destructing\n"; }
};


int main()
{
    auto sp = make_shared<test>();

    sp->addvec(); // when called, destructor is not invoked and
                  // LeakSanitizer reports a memory leak
}
Run Code Online (Sandbox Code Playgroud)

对象test由 管理std::shared_ptr,并且在调用 后addvec,第二个shared_ptr实例将存储在内部向量中 (ref_count == 2)。

但析构函数从未被调用,并且报告了内存泄漏。为什么是这样?

使用g++ -g -fsanitize=leak c.cpp
GCC 版本 12.2.1编译

Sam*_*hik 7

显示的代码会导致循环引用。该对象最终包含shared_ptr其自身。

仅当该对象的最后一个对象本身被销毁时,shared_ptr引用的对象才会自动被删除。deleteshared_ptr

在所示的代码中,这种情况永远不会发生。因此,内存泄漏。

根据定义,所谓的“智能”指针只有在不存在循环引用的情况下才起作用。

通过一些仔细的规划,可以使用 a 的服务std::weak_ptr来处理这种情况。