gpt4 book ai didi

c++ - make_shared() 在给它一个已经创建的对象时调用析构函数两次

转载 作者:太空宇宙 更新时间:2023-11-04 15:16:56 25 4
gpt4 key购买 nike

将 VS 2015 与 v120 结合使用。

所以我得到了内存异常,因为当我在一个已经构造的对象上调用 make_shared() 时。已经构造的对象有一个指向另一个用 new 分配的对象的指针,所以当它第一次调用析构函数时。对象销毁了,再调用的时候,对象已经销毁了。

我认为在这种情况下对象将被移动并且永远不会调用析构函数。

代码:

子对象:

#include "Obj.h"

Obj::Obj(int i)
{
cout << "const Obj " << this << "\n";
m_i = i;
}
Obj::~Obj()
{
cout << "-------------------DELETING o " << this << "\n";
}

包含对象:

#include "BigObj.h"

BigObj::BigObj(int i)
{
cout << "const BIgObj " << this << "\n";
m_o = new Obj(i);
}


BigObj::BigObj()
{
}

BigObj::BigObj(const BigObj& o)
{
cout << "called copy const \n";
m_o = o.m_o;
}

BigObj::~BigObj()
{
delete m_o;
cout << "----------------DEL bigobj " << this << "\n";
}

主要内容:

int main(char argc, char** argv){

BigObj oo = BigObj(10);
shared_ptr<BigObj> shr= make_shared<BigObj>(oo);

BigObj oo2 = BigObj(100);
cout << "finished\n";
system("pause");
}

输出:

const BIgObj 000000C61F4FFAD8
const Obj 000000C61F658330
called copy const
const BIgObj 000000C61F4FFB28
const Obj 000000C61F658510
finished
Press any key to continue . . .
-------------------DELETING o 000000C61F658510
----------------DEL bigobj 000000C61F4FFB28
-------------------DELETING o 000000C61F658330
----------------DEL bigobj 000000C61F65AFB0
-------------------DELETING o 000000C61F658330

这是我用来说明问题的测试代码。在实际项目中,我创建了需要包含大量信息的对象,然后将它们推送到一个 vector 上,该 vector 为各种线程共享以处理信息。这样一来,无论线程拥有该对象,最后都会将其删除。

最佳答案

呃 - 你复制构造函数(BigObj)复制内部指针(Obj)然后有两个删除(一旦自动实例被清理然后共享指针)这不好..复制构造函数(BigObj)没有做正确的事情,它应该实例化子对象(Obj) 使用它的 (Obj) 复制构造函数...

编辑:干净的实现..

class Obj
{
};

class BigObj
{
public:
// Default constructor
BigObj() : _obj(new Obj)
{ }
// Move constructor
BigObj(BigObj&& other) : _obj(move(other._obj)) // take ownership of the subobject
{ }
// Move assignment
BigObj& operator=(BigObj&& other)
{
_obj = move(other._obj); // take ownership of the subobject
return *this;
}
private:
unique_ptr<Obj> _obj;
};

关于c++ - make_shared() 在给它一个已经创建的对象时调用析构函数两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30355385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com