shared_ptr.reset()不删除

Mat*_*zek 1 c++ shared-ptr c++11

我开始学习shared_ptr和weak_ptr.理论上一切看起来都很简单 但是当我开始测试时,嗯...我有这个非常简单的程序:

#include <iostream>
#include <memory>
using namespace std;

class Second
{
public:
    Second()
    {
        cout << "Second created" << endl;
    }
    ~Second()
    {
        cout << "Second deleted" << endl;
    }
};

class Main
{
public:
    shared_ptr<Second> second;
    Main()
    {
        cout << "Main created" << endl;
        second = make_shared<Second>(*(new Second()));
    }
    ~Main()
    {
        second.reset();
        cout << "Main deleted" << endl;
    }
};

void fun()
{
    shared_ptr<Main> main = make_shared<Main>(*(new Main()));
}

int main()
{
    cout << "Program started" << endl;
    fun();

    cout << "Program ended" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是,第二个永远不会被删除.这是我的输出:

Program started
Main created
Second created
Main deleted
Program ended
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我想,如果我重置shared_ptr,并且它的最后一个shared_ptr存在,那么对象就会自动删除.

Soa*_*Box 8

您正在初始化您的共享指针错误.使用new时根本不需要使用make_shared.您传递给的参数make_shared将转发到您正在创建的类的构造函数.

因此,在您的代码中,您的make_shared调用应如下所示:

shared_ptr<Main> main = make_shared<Main>();
Run Code Online (Sandbox Code Playgroud)

shared_ptr<Second> main = make_shared<Second>();
Run Code Online (Sandbox Code Playgroud)

相反,你所做的是泄露每个类的一个版本(通过明确使用new而不是删除它)然后将泄漏的值复制到第二个版本中.通过将表达式分成多行,我们可以更容易地看到你做错了什么:

Second *p = new Second;
shared_ptr<Second> ss = make_shared<Second>(*p); // Calls the Second class copy constructor
// p is never deleted, so it is leaked.
Run Code Online (Sandbox Code Playgroud)