Удаление унаследованных типов - PullRequest
0 голосов
/ 13 июля 2011

У меня есть 2 класса:

class A
{
public:
char * x;
char * y;
char * z;
A();
~A();
}

class B: public A
{
public:
char * o;
B();
~B();
}

Я хочу удалить [] x, y и z в деструкторе класса B (и да, конструктор A правильно распределяет x, y и z).Код скомпилируется нормально, но при выполнении он вылетает.Свойства являются общедоступными, поэтому унаследованные черты должны освободить мне память, верно?

Ответы [ 3 ]

1 голос
/ 13 июля 2011

В зависимости от вашего фактического кода, это может не вызывать удаление на o, и это может быть двойное удаление x, y, z.

Вы должны правильно осуществить уничтожениев базовом классе (для членов базового класса) и в производном классе (для членов производного класса).Пусть поведение деструктора ручного управления обрабатывает разрушение базового класса.

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.12

Когда я пишу деструктор производного класса, нужно ли явно вызывать деструктор для моей базыclass?

  • Нет ... Деструктор производного класса (независимо от того, определяете ли вы его явно) автоматически вызывает деструкторы для подобъектов базового класса

Кроме того,в зависимости от того, как используется ваш код, вам также может потребоваться сделать виртуальный деструктор.

http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.7

Когда мой деструктор должен быть виртуальным?

  • Когда кто-то удалит объект производного класса через указатель базового класса.
0 голосов
/ 13 июля 2011

Я назвал конструктор / деструктор А так же, как и В, так что возникает несколько проблем с тем, как я его кодировал, в частности, серьезная утечка памяти.Спасибо за помощь, ребята, я просто растерялся из-за того, что кто-то сказал мне, что только конструкторы были унаследованы.

0 голосов
/ 13 июля 2011

Вы должны быть в состоянии, является ли это хорошей идеей, это другой вопрос.

Вы говорите, что ваш код дает сбой, но вы не предоставили никаких доказательств того, что это происходит потому, что вы удаляете переменные mmeber А в деструкторе Б. На самом деле, если бы мне пришлось угадывать, я бы сказал, что причиной денег является отсутствие конструкторов копирования и операторов присваивания в A и B (так называемое «правило трех», Google google).

Если ваша программа аварийно завершает работу, то, вероятно, будет хорошей идеей опубликовать аварийный код. Думаю, это повысит ваши шансы получить полезный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...