虚拟解构器 - 内存泄漏

时间:2016-05-16 15:44:05

标签: c++ memory-leaks

现在我们必须创建class X(作为基类)和class Y(作为派生)。它们都使用整数指针来保存不同大小的分配。

class X
{
  int *p;
  public:
         X() {p=new int[2];}
         ~X() {delete[] p;}
};

class Y : public X {
  int *q;
  public:
         Y() {q=new int[4];}
         ~Y() {delete[] q;}
};

让我们在一个简单的循环中尝试:

for(int i=0;i<8;i++){X *ptr =new Y; delete ptr;}

导致内存泄漏的原因是什么以及我们可以做些什么来解决它?

1 个答案:

答案 0 :(得分:1)

此循环的每次执行

for(int i=0;i<8;i++){X *ptr =new Y; delete ptr;}

你的程序首先创建一个大小为2 的整数指针(分配2 * 4 = 8个字节),后者创建一个大小为4的整数指针(4 * 4 =分配16个字节) 但只是删除了第一个。因此,对于每个循环,它只会泄漏16个字节,因为您无法在派生类Y中到达解构函数。

它被称为基类中缺少虚拟解构器导致的内存泄漏。当您在类X virtual中创建解构函数时,编译器将能够删除Y类型的指针。所以你必须改变这个陈述

~X() {delete[] p;}

进入这个:

virtual ~X() {delete[] p;}