使用对象的浅拷贝时双重免费错误...如何修复?

时间:2011-03-11 02:28:18

标签: c++ object copy delete-operator

如何从浅复制对象与原始对象中删除双重(删除)错误。

一个简单的例子:

class INT
{
   int *p; //dynamic.

   //define here fancy constructors etc.
   set(int i){ p=new int; p=i;}
   ~INT();
}

INT::~INT()
{
   if(p) delete p;
}

void somefunction(INT a)
{
   //done some stuff ,e.g. call some display function
}
//note here, that a destructor will be called, and a.p will vanish.

int main(void)
{
   INT a; a.set(2);
   somefunction(a);//shallow copy
}
//CRASH BOOM BOOM!

我想要一个通用的解决方案,因为传递对象是一件微不足道的事情,而像这样天真的东西,导致一个可怕的/可怕的错误只是'很棒'。

我怀疑有很多方法可以解决这个问题(其中一些甚至我都能想到),但我很好奇是否有任何通用(几乎适用于所有地方)解决这个问题的方法?

4 个答案:

答案 0 :(得分:5)

每当你的类中有apointer对象时,你需要声明自己的复制构造函数和赋值运算符方法,以避免浅拷贝问题。 看看这个link关于这个

的mor信息

答案 1 :(得分:3)

病人:医生,我这样做会很疼! 医生:不要这样做。

你可以在不处理原始指针的情况下编写代码,至少100:1。根据具体情况,你可能需要一个智能指针,或者你可能需要一个集合,但你需要一个指针的机会似乎很遥远。

不要询问如何解决你正在做的事情,而是告诉我们你要完成的事情要好得多,所以我们可以告诉你如何做到这一点。

答案 2 :(得分:2)

对于具有动态成员的所有对象,通常最好定义自己的复制和复制赋值操作。

关于“大”对象和昂贵的复制,reference counting是许多语言和模式所采用的技术,以规避指针所有权问题。请注意,在这种情况下,对象的所有副本都指向同一个共享对象,因此其他人可以看到对一个实例的共享对象的修改。有关详细信息,请参阅boost shared_ptr文档。

答案 3 :(得分:1)

问题“如何避免从浅层复制对象中双重删除?”应该真的是“当我不想要那个时,我该如何避免浅拷贝?”。

有些选择:
- 避免分配内存的原始指针
- 不要复制对象! :-)
- 管理对象外的内存
- 使用智能指针
- 实施深度复制

您的选择取决于您实际使用对象的内容。