现在我们必须创建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;}
导致内存泄漏的原因是什么以及我们可以做些什么来解决它?
答案 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;}