对同一指针变量重复调用复制构造函数会导致内存泄漏

Repeated call of copy constructor for same pointer-variable a memory leak?

本文关键字:构造函数 泄漏 内存 复制 调用 指针 变量      更新时间:2023-10-16

我有一个小问题:

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);

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

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

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

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

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

我假设"but this crash my program as soon as the destructor called"意味着主类的析构函数调用'myFoo'delete。

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