Mar. 30th, 2007

yorool_gui: (Default)
Делающий полезную работу в деструкторе нарывается на неприятности.
Ибо порядок вызова деструкторов неопределен.
И если класс Фу в своем деструкторе что-то пишет, а класс Ба это в своем деструкторе читает.
То оно иногда будет работать, а иногда нет, в зависимости от порядка создания Фу и Ба и мнения компилятора по этому поводу.
Поэтому отсутствие деструкторов в Яве следует считать благом.

update: мне указали, что порядок вызова деструкторов определен и обратен порядку конструирования. Но описанная проблема все равно есть. Пусть у нас есть классы A, B и С. Рассмотрим вот такой код:

A a;
void foo()
{
 ....
 B b(a);
 ...
 C c(a);
 ...
}
И предположим, что и B и С в деструкторах проделывают что-то над a. Тогда достаточно поменять местами строчки с конструкторами (на первый взгляд вроде бы безопасная операция - мы же знаем, что конструкторы только запомнят ссылку на а и ничего больше!), чтобы логика программы поменялась.

Profile

yorool_gui: (Default)
Michael Ilyin

April 2017

S M T W T F S
      1
2 345678
910 1112131415
16171819202122
23242526272829
30      

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 4th, 2025 08:22 pm
Powered by Dreamwidth Studios