如何从浅复制对象与原始对象中删除双重(删除)错误。
一个简单的例子:
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!
我想要一个通用的解决方案,因为传递对象是一件微不足道的事情,而像这样天真的东西,导致一个可怕的/可怕的错误只是'很棒'。
我怀疑有很多方法可以解决这个问题(其中一些甚至我都能想到),但我很好奇是否有任何通用(几乎适用于所有地方)解决这个问题的方法?
答案 0 :(得分:5)
每当你的类中有apointer对象时,你需要声明自己的复制构造函数和赋值运算符方法,以避免浅拷贝问题。 看看这个link关于这个
的mor信息答案 1 :(得分:3)
你可以在不处理原始指针的情况下编写代码,至少100:1。根据具体情况,你可能需要一个智能指针,或者你可能需要一个集合,但你需要一个指针的机会似乎很遥远。
不要询问如何解决你正在做的事情,而是告诉我们你要完成的事情要好得多,所以我们可以告诉你如何做到这一点。
答案 2 :(得分:2)
对于具有动态成员的所有对象,通常最好定义自己的复制和复制赋值操作。
关于“大”对象和昂贵的复制,reference counting是许多语言和模式所采用的技术,以规避指针所有权问题。请注意,在这种情况下,对象的所有副本都指向同一个共享对象,因此其他人可以看到对一个实例的共享对象的修改。有关详细信息,请参阅boost shared_ptr文档。
答案 3 :(得分:1)
问题“如何避免从浅层复制对象中双重删除?”应该真的是“当我不想要那个时,我该如何避免浅拷贝?”。
有些选择:
- 避免分配内存的原始指针
- 不要复制对象! :-)
- 管理对象外的内存
- 使用智能指针
- 实施深度复制
您的选择取决于您实际使用对象的内容。