наследование
От: rust2000  
Дата: 30.09.04 13:58
Оценка:
Пусть A — базовый класс, B — производный от A,
Созадем указатель p так:

A* p;
p = new B;

Вопрос: При условии что B не имеет явного описания деструктора,
можно ли освободить память, динамически выделенную под B, путем

delete p;

или же "мусор" все равно останется? Спасибо.
Re: наследование
От: Lorenzo_LAMAS  
Дата: 30.09.04 14:01
Оценка: +1
Хехе, не имея определений классов ответить на этот вопрос нельзя. Но вообще, если в B не нужен явно определенный деструктор (видимо об этом ты и говорил) и в А деструктор виртуальный, то все ок
Of course, the code must be complete enough to compile and link.
Re: наследование
От: Bell Россия  
Дата: 30.09.04 14:02
Оценка:
Здравствуйте, rust2000, Вы писали:

R>Пусть A — базовый класс, B — производный от A,

R>Созадем указатель p так:

R>A* p;

R>p = new B;

R>Вопрос: При условии что B не имеет явного описания деструктора,

R>можно ли освободить память, динамически выделенную под B, путем
R>delete p;

R>или же "мусор" все равно останется? Спасибо.


Нельзя. Такое удаление ведет к неопределенному поведению. Для корректной работы класс B должен иметь виртуальный деструктор.
Любите книгу — источник знаний (с) М.Горький
Re[2]: наследование
От: Vamp Россия  
Дата: 30.09.04 14:03
Оценка:
B>Нельзя. Такое удаление ведет к неопределенному поведению. Для корректной работы класс B должен иметь виртуальный деструктор.
А не класс А?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: наследование
От: Bell Россия  
Дата: 30.09.04 14:05
Оценка: +1
Здравствуйте, Bell, Вы писали:

B>Нельзя. Такое удаление ведет к неопределенному поведению. Для корректной работы класс B должен иметь виртуальный деструктор.


Упс... Все перепутал — сказался стереотип: если класс называется В, то это базовый класс
Отвечаю правильно: если бызовый класс (т.е. А) имеет виртуальный деструктор, то все в порядке. Если нет — неопределенное поведение.
Любите книгу — источник знаний (с) М.Горький
Re: наследование
От: Mikka77  
Дата: 30.09.04 14:07
Оценка: :)
Здравствуйте, rust2000, Вы писали:

Нельзя. Если объект производного класса был создан через указатель на базовый класс, то для того, чтобы был вызван деструктор производного (в д. случае класса "В"), класса, в базовом (класс "А") надо объявить деструктор как виртуальный — тогда он вызовется перед деструктором В, а иначе не вызовется никак.

То есть:

class A{
public:
  virtual ~A();
};
class B : public A{
public:
  ~B() {
   //здесь освобождаем память (например)
  }
};
"Количество времени, необходимое для решения задачи, не зависит от того, было это время использовано для решение данной задачи или нет." ©Mikka77
Re: наследование
От: Auster Ниоткуда  
Дата: 05.10.04 09:23
Оценка:
В данном конкретном случае, если эти классы тривиальны, можно. Память, выделенная под сам объект B будет освобождена вся.

Но другое дело, если класс B содержит члены (members) типа string или другие, размещающие память динамически в своих конструкторах, либо подобное может появиться позже. Если же класс A уже имеет виртуальные функции, тем более, если будет корневым в иерархии, то, конечно, виртуальный деструктор ему не помешает и уже никак не скажется на эффективности.
... << RSDN@Home 1.1.3 stable >>
Re[2]: наследование
От: Bell Россия  
Дата: 05.10.04 09:51
Оценка:
Здравствуйте, Auster, Вы писали:


A>В данном конкретном случае, если эти классы тривиальны, можно. Память, выделенная под сам объект B будет освобождена вся.


Неверно. Подобное удаление ведет к неопределенному поведению.
5.3.5/3
In the first alternative (delete object), if the static type of the operand 
is different from its dynamic type, the static type shall be a base class 
of the operand’s dynamic type and the static type shall have a virtual
destructor or the behavior is undefined.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.