【问题标题】:Default destructor freeing an array member of a class, c++释放类的数组成员的默认析构函数,C++
【发布时间】:2011-11-05 21:21:15
【问题描述】:

假设我有以下课程:

class A {};

Class C {
private:
    A a[10];
};

int main() {
    C c;
}

这段代码会导致内存泄漏吗?如题,编译器为 C 类定义的默认析构函数会成功释放 A 对象数组的内存吗?

我试图检查自己,但我不知道如何在 OSX 10.7 上运行 valgrind...

【问题讨论】:

  • @Stan:看看代码,A 确实是空的。但是,这对泄漏没有任何影响。
  • @phresnel - 我明白了。我只是想知道 azphare 是否在 A 中遗漏了什么。

标签: c++ arrays class destructor


【解决方案1】:

这不会泄漏。如果你想确定,在A的析构函数中放一条调试语句。

编辑:简单示例...

#include <iostream>

class A 
{
public:
  A() { std::cout << "A::A()" << std::endl; }
  ~A() { std::cout << "A::~A()" << std::endl; }
};

Class C {
private:
    A a[10];
};

int main() {
    C c;
}

现在编译和运行上面的例子,应该会产生 10 个第一个调试语句的实例和 10 个第二个调试语句的实例。最后 10 个语句是在 A 的 10 个实例被销毁时生成的(这是自动为您完成的 - 因此术语自动存储,当它们超出范围时 - 在这种情况下,即当C [拥有它们] 的实例超出范围[main 的末尾]。)

【讨论】:

  • 好的,由于数组的内存是在堆栈上分配的,所以当 main() 完成执行时它会被释放(对吗?)你能告诉我你在析构函数中的调试语句是什么意思吗?一种?我不确定我是否理解...
  • A::~A(){std::clog &lt;&lt; "Destructing an A at" &lt;&lt; static_cast&lt;void*&gt;(this) &lt;&lt; std::endl;}。这将证明C c 中的所有 10 个 A 对象都已销毁。
【解决方案2】:

不,它不会导致内存泄漏。这些类根本不使用 new,因此堆中没有动态分配的内存。

【讨论】:

    【解决方案3】:

    内存泄漏问题仅出现在动态内存分配中。对于自动分配的内存(通常在堆栈或数据段上),永远不会发生内存泄漏。

    【讨论】:

      猜你喜欢
      • 2017-01-29
      • 2018-05-13
      • 1970-01-01
      • 2017-11-21
      • 2012-09-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多