重复调用复制构造函数为同一指针变量内存泄漏?

时间:2011-10-04 10:36:02

标签: c++ memory memory-leaks deep-copy

我有一个小问题:

Foo *myFoo;
myFoo = new Foo(anotherFoo);     // some deep copy of another object
myFoo = new Foo(yetAnotherFoo);  // another deep copy of yet another object

这是内存泄漏吗?如果是,我该如何正确避免它?我的程序中的情况是,'myFoo'是一个类成员,我想将它作为“唯一的”存储对象,不时地用于某个其他对象的深层副本(因为复制的对象被修改)之后我需要初始对象供以后比较)。

我尝试了一个简单的解决方法,如:

// within a class method of the same class
if (myFoo!=NULL) delete myFoo;
myFoo = new Foo(fooToStore);

但是一旦调用析构函数,这会崩溃我的程序。我不确定我的(非平凡的)析构函数是否有点错误(这里不讨论不同的问题)或者通常禁止在类方法中通过删除删除类成员对象。

非常感谢您的时间和帮助 - 感谢它! 标记

3 个答案:

答案 0 :(得分:4)

在重新分配指针之前不删除new表达式的结果肯定会导致内存泄漏。显式 - delete解决方案应该可行,但您真正想要的是一个智能指针类型成员,例如一个scoped_ptr<Foo>

也许(或可能不会)神奇地解​​决你的析构函数问题。

答案 1 :(得分:2)

是的,这是内存泄漏,因为对myFoo的第二次分配会导致您分配的第一个Foo无法访问。在连续分配之间删除myFoo是正确的做法。请注意,您不需要检查空指针:delete负责处理。你很可能在Foo的析构函数中遇到了一些问题。

答案 2 :(得分:0)

我认为“但是一旦调用析构函数就会崩溃我的程序”意味着主类析构函数调用'myFoo'delete。

不要忘记在主类构造函数中将'myFoo'初始化为null,如果没有创建'myFoo'实例,这将防止主类析构函数崩溃。