【问题标题】:Repeated call of copy constructor for same pointer-variable a memory leak?重复调用相同指针变量的复制构造函数导致内存泄漏?
【发布时间】:2011-10-04 10:36:02
【问题描述】:

我有一个小问题:

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

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

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

【问题讨论】:

  • 旁注:调用delete之前不需要检查myFoo是否为NULL,delete正确处理NULL值。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • ... 如果析构函数删除未初始化的成员指针,甚至可能是构造函数。
    • 感谢您的帮助!我将仔细研究构造函数和析构函数。问候,马克
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多