是否有相同数量的构造函数和析构函数调用确保没有内存泄漏?

时间:2012-08-01 10:38:43

标签: c++ memory-management memory-leaks

假设我们有一个名为memoryCounter的类,它试图捕获由MyClass类引起的内存泄漏。

class memoryCounter
{
public:
    static int MyClassCount;
};
int memoryCounter::MyClassCount = 0;

我们还说我们将以下行放在MyClass的构造函数和析构函数中(以及它具有的任何其他构造函数,假设我们不修改构造函数之外的任何其他位置的MyClassCount) /析构函数):

MyClass()
{
    memoryCounter::MyClassCount++;
}
virtual ~MyClass()
{
    memoryCounter::MyClassCount--;
}

现在,我们可以绝对确定如果memoryCounter::MyClassCount包含零,那么我们分配到目前为止的所有内存都被释放并且没有泄漏吗?或者可能存在变量将包含零的情况,但是会有分配的内存我们没有释放(请考虑'MyClass'也是基类或派生类的情况)?

4 个答案:

答案 0 :(得分:3)

不,你不能。也可以有其他构造函数(至少是copy-constructor)。你不算数。

此外,您无法计算static变量的破坏程度如此简单,因为它们会在main退出后被破坏

答案 1 :(得分:2)

如果计数为零,则没有MyClass的实例。无论MyClass对象是完整对象还是基类子对象,或者对于成员子对象,它都适用。这并不一定意味着没有内存泄漏,因为MyClass本身可能会泄漏内存。

需要注意的是默认生成的复制构造函数。你说假设“它拥有的任何其他构造函数”会增加你的全局计数,但是很容易错过代码中没有出现的构造函数。你可以在这里应用三个规则 - 你定义一个析构函数,所以你应该定义一个复制构造函数。请注意,规则还告诉您定义一个复制赋值运算符,在这种情况下不需要。

答案 2 :(得分:1)

谁说只有构造函数分配内存?如果某些非构造函数成员函数(静态或非静态)分配内存,并且析构函数未正确清理,则泄漏了该内存。

所以,答案是。您已经计算了通过标准构造函数创建的类实例。不多也不少。

答案 3 :(得分:0)

您假设MyClass(以及从中派生的任何内容)都已正确编写。特别是,不会检测到此泄漏:

class BadClass : private MyClass
{
  public:
     BadClass() { int *x = new int(5); }
}

你的计数器做的是告诉你每个结构都有一个破坏,这意味着没有人泄漏任何'MyClass'对象。

但这与没有内存泄漏的情况不一样。