如何避免两次删除已分配的内存?

时间:2010-08-23 13:14:00

标签: dynamic

例如,如果我有一个包含指向动态分配对象的指针的对象,则将其分配给另一个具有相同类型的对象,即

object2 = object1;

并且析构函数将显式删除动态分配的对象。因此,当object2和object1超出范围时,将发生错误(我认为这是因为动态分配的对象的地址被删除了两次)。那么我该怎么做才能解决/避免这个问题呢?

2 个答案:

答案 0 :(得分:0)

我猜这是C ++?在这种情况下,请查看smart pointers。引用计数(boost :: shared_ptr)有助于解决此类问题。

答案 1 :(得分:0)

你无法避免它因为你将object1的所有位都复制到了object2,会有两个指向同一个地方的指针,但是析构函数会被调用两次,因为有两个对象。

fisrt解决方案将阻止对object2的析构函数的调用:

char object2_data[sizeof(object1)];
Type* object2 = (Type*) object2_data;
*object2 = object1;
...
object1.do_something();
object2->do_something(); //However, the pointer is different

第二种方法是重新设计对象并添加一个bool变量,该变量将告诉对象是否是副本。删除对象时,如果是副本,请不要删除指针。最后,实现复制构造函数并重载operator =以复制对象并设置bool变量以告知它是一个副本。但是,如果删除原始对象,则不能使用副本,因为它们将具有无效指针。