1

假设我们有一个名为的类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

4 回答 4

3

不,你不能。也可以有其他构造函数(至少是复制构造函数)。你不算他们。

你也不能static这么简单地计算变量的破坏,因为它们在main退出后被破坏

于 2012-08-01T10:40:25.177 回答
2

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

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

于 2012-08-01T11:05:05.473 回答
1

谁说只有构造函数才能分配内存?如果某些非构造函数成员函数(静态或非静态)分配内存,而析构函数没有正确清理,则您已经泄漏了该内存。

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

于 2012-08-01T11:09:05.540 回答
0

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

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

您的计数器所做的是告诉您每个构造都有一个破坏,这意味着没有人泄漏任何“MyClass”对象。

但这与没有内存泄漏不同。

于 2012-08-01T11:53:53.220 回答