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)
问题是,第二个永远不会被删除.这是我的输出:
Run Code Online (Sandbox Code Playgroud)Program started Main created Second created Main deleted Program ended
这是怎么回事?我想,如果我重置shared_ptr,并且它的最后一个shared_ptr存在,那么对象就会自动删除.
您正在初始化您的共享指针错误.使用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)