2016-05-16 3 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;} 
Смежные вопросы