2016-05-16 56 views
1

现在我们必须创建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;} 

是什么原因导致内存泄漏那里,我们能做些什么来解决这个问题?

+2

我相信术语 “析构函数” 是常用的,而不是 “解构” – Slava

+1

[**这个问题**](HTTPS:/ /stackoverflow.com/questions/461203/when-to-use-virtual-destructors)是何时/何处使用虚拟破坏者的近库,这个问题的案例就是其中之一。 – WhozCraig

+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;}