Хехе, не имея определений классов ответить на этот вопрос нельзя. Но вообще, если в B не нужен явно определенный деструктор (видимо об этом ты и говорил) и в А деструктор виртуальный, то все ок
Of course, the code must be complete enough to compile and link.
Здравствуйте, rust2000, Вы писали:
R>Пусть A — базовый класс, B — производный от A, R>Созадем указатель p так:
R>A* p; R>p = new B;
R>Вопрос: При условии что B не имеет явного описания деструктора, R>можно ли освободить память, динамически выделенную под B, путем R>delete p;
R>или же "мусор" все равно останется? Спасибо.
Нельзя. Такое удаление ведет к неопределенному поведению. Для корректной работы класс B должен иметь виртуальный деструктор.
Здравствуйте, Bell, Вы писали:
B>Нельзя. Такое удаление ведет к неопределенному поведению. Для корректной работы класс B должен иметь виртуальный деструктор.
Упс... Все перепутал — сказался стереотип: если класс называется В, то это базовый класс
Отвечаю правильно: если бызовый класс (т.е. А) имеет виртуальный деструктор, то все в порядке. Если нет — неопределенное поведение.
Нельзя. Если объект производного класса был создан через указатель на базовый класс, то для того, чтобы был вызван деструктор производного (в д. случае класса "В"), класса, в базовом (класс "А") надо объявить деструктор как виртуальный — тогда он вызовется перед деструктором В, а иначе не вызовется никак.
То есть:
class A{
public:
virtual ~A();
};
class B : public A{
public:
~B() {
//здесь освобождаем память (например)
}
};
В данном конкретном случае, если эти классы тривиальны, можно. Память, выделенная под сам объект B будет освобождена вся.
Но другое дело, если класс B содержит члены (members) типа string или другие, размещающие память динамически в своих конструкторах, либо подобное может появиться позже. Если же класс A уже имеет виртуальные функции, тем более, если будет корневым в иерархии, то, конечно, виртуальный деструктор ему не помешает и уже никак не скажется на эффективности.
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.