по поводу деструкторов
От: pjeff Украина  
Дата: 11.02.04 00:27
Оценка:
Такой вопрос:

чем отличается конструкция

class A
{
public:
  A();
  virtual ~A();
}


от

class A
{
public:
  A();
  ~A();
}


Я просто у знакомых спрашивал — никто толком так и не рассказал...

З.Ы. Ногами прозьба не пинать
Re: по поводу деструкторов
От: folk Россия  
Дата: 11.02.04 00:47
Оценка:
Здравствуйте, pjeff, Вы писали:

P>Такой вопрос:


P>чем отличается конструкция


P>
P>class A
P>{
P>public:
P>  A();
P>  virtual ~A();
P>}
P>


P>от


P>
P>class A
P>{
P>public:
P>  A();
P>  ~A();
P>}
P>


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, что не есть хорошо.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[2]: по поводу деструкторов
От: pjeff Украина  
Дата: 11.02.04 00:57
Оценка:
Здравствуйте, 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. Я так понимаю?
Re[3]: по поводу деструкторов
От: folk Россия  
Дата: 11.02.04 01:07
Оценка:
Здравствуйте, 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.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[4]: по поводу деструкторов
От: pjeff Украина  
Дата: 11.02.04 01:14
Оценка:
Здравствуйте, folk, Вы писали:

F>Примерно так. Памяти освободится столько же, сколько было выделено под объект B (тут я немного не уверен), но деструкторы B и всех его данных-членов не будут вызваны, что может повлечь всякие неприятности, в том числе memory leaks.


сенк, буду знать
Re[4]: по поводу деструкторов
От: Шахтер Интернет  
Дата: 11.02.04 02:30
Оценка:
Здравствуйте, 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 нет), то хип будет разрушен.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[5]: по поводу деструкторов
От: folk Россия  
Дата: 11.02.04 03:52
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Здравствуйте, 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.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.