P>Я просто у знакомых спрашивал — никто толком так и не рассказал...
P>З.Ы. Ногами прозьба не пинать
Допишем твой пример:
class B : public A
{
public:
~B() { std::cout << "~B\n"; }
};
int main()
{
A* pa = new B;
delete pa;
}
Если деструктор A виртульный, то при delete pa сначала вызовется деструктор B, а потом деструктор A.
Если деструктор A невиртуальный, то вызовется только деструктор A, что не есть хорошо.
Здравствуйте, folk, Вы писали:
F>Допишем твой пример:
F>
F>class B : public A
F>{
F>public:
F> ~B() { std::cout << "~B\n"; }
F>};
F>int main()
F>{
F> A* pa = new B;
F> delete pa;
F>}
F>
F>Если деструктор A виртульный, то при delete pa сначала вызовется деструктор B, а потом деструктор A. F>Если деструктор A невиртуальный, то вызовется только деструктор A, что не есть хорошо.
т.е. если в классе B содержатся переменные объекты других классов, то их деструкторы не визовятся, и все это пойдет в leaks. Я так понимаю?
Здравствуйте, pjeff, Вы писали:
P>Здравствуйте, folk, Вы писали:
F>>Допишем твой пример:
F>>
F>>class B : public A
F>>{
F>>public:
F>> ~B() { std::cout << "~B\n"; }
F>>};
F>>int main()
F>>{
F>> A* pa = new B;
F>> delete pa;
F>>}
F>>
F>>Если деструктор A виртульный, то при delete pa сначала вызовется деструктор B, а потом деструктор A. F>>Если деструктор A невиртуальный, то вызовется только деструктор A, что не есть хорошо.
P>т.е. если в классе B содержатся переменные объекты других классов, то их деструкторы не визовятся, и все это пойдет в leaks. Я так понимаю?
Примерно так. Памяти освободится столько же, сколько было выделено под объект B (тут я немного не уверен), но деструкторы B и всех его данных-членов не будут вызваны, что может повлечь всякие неприятности, в том числе memory leaks.
Здравствуйте, folk, Вы писали:
F>Примерно так. Памяти освободится столько же, сколько было выделено под объект B (тут я немного не уверен), но деструкторы B и всех его данных-членов не будут вызваны, что может повлечь всякие неприятности, в том числе memory leaks.
Здравствуйте, folk, Вы писали:
F>Здравствуйте, pjeff, Вы писали:
P>>Здравствуйте, folk, Вы писали:
F>>>Допишем твой пример:
F>>>
F>>>class B : public A
F>>>{
F>>>public:
F>>> ~B() { std::cout << "~B\n"; }
F>>>};
F>>>int main()
F>>>{
F>>> A* pa = new B;
F>>> delete pa;
F>>>}
F>>>
F>>>Если деструктор A виртульный, то при delete pa сначала вызовется деструктор B, а потом деструктор A. F>>>Если деструктор A невиртуальный, то вызовется только деструктор A, что не есть хорошо.
P>>т.е. если в классе B содержатся переменные объекты других классов, то их деструкторы не визовятся, и все это пойдет в leaks. Я так понимаю?
F>Примерно так. Памяти освободится столько же, сколько было выделено под объект B (тут я немного не уверен), но деструкторы B и всех его данных-членов не будут вызваны, что может повлечь всякие неприятности, в том числе memory leaks.
Есть одна маленькая проблема с памятью. Если A смещен в B (например, у B есть виртуальные методы, а у A нет), то хип будет разрушен.
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, folk, Вы писали:
F>>Примерно так. Памяти освободится столько же, сколько было выделено под объект B (тут я немного не уверен), но деструкторы B и всех его данных-членов не будут вызваны, что может повлечь всякие неприятности, в том числе memory leaks.
Ш>Есть одна маленькая проблема с памятью. Если A смещен в B (например, у B есть виртуальные методы, а у A нет), то хип будет разрушен.
Заглянул в 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.
Так что и верное освобождение блока, и разрушение хипа — все суть ub.