![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Делающий полезную работу в деструкторе нарывается на неприятности.
Ибо порядок вызова деструкторов неопределен.
И если класс Фу в своем деструкторе что-то пишет, а класс Ба это в своем деструкторе читает.
То оно иногда будет работать, а иногда нет, в зависимости от порядка создания Фу и Ба и мнения компилятора по этому поводу.
Поэтому отсутствие деструкторов в Яве следует считать благом.
update: мне указали, что порядок вызова деструкторов определен и обратен порядку конструирования. Но описанная проблема все равно есть. Пусть у нас есть классы A, B и С. Рассмотрим вот такой код:
A a;
void foo()
{
....
B b(a);
...
C c(a);
...
}
И предположим, что и B и С в деструкторах проделывают что-то над a. Тогда достаточно поменять местами строчки с конструкторами (на первый взгляд вроде бы безопасная операция - мы же знаем, что конструкторы только запомнят ссылку на а и ничего больше!), чтобы логика программы поменялась.
Ибо порядок вызова деструкторов неопределен.
И если класс Фу в своем деструкторе что-то пишет, а класс Ба это в своем деструкторе читает.
То оно иногда будет работать, а иногда нет, в зависимости от порядка создания Фу и Ба и мнения компилятора по этому поводу.
Поэтому отсутствие деструкторов в Яве следует считать благом.
update: мне указали, что порядок вызова деструкторов определен и обратен порядку конструирования. Но описанная проблема все равно есть. Пусть у нас есть классы A, B и С. Рассмотрим вот такой код:
A a;
void foo()
{
....
B b(a);
...
C c(a);
...
}
И предположим, что и B и С в деструкторах проделывают что-то над a. Тогда достаточно поменять местами строчки с конструкторами (на первый взгляд вроде бы безопасная операция - мы же знаем, что конструкторы только запомнят ссылку на а и ничего больше!), чтобы логика программы поменялась.
no subject
Date: 2007-03-30 11:29 am (UTC)no subject
Date: 2007-03-30 11:52 am (UTC)И про виртуальность деструктора забывать не надо.
no subject
Date: 2007-03-30 12:00 pm (UTC)кстати на c# такого рода вещи делаются через одно место, т.к. не определено время вызова (не порядок а именно время, т.к. GC может отложить это)
no subject
Date: 2007-03-30 01:43 pm (UTC)no subject
Date: 2007-03-31 09:42 am (UTC)no subject
Date: 2007-03-31 05:22 pm (UTC)no subject
Date: 2007-03-30 11:49 am (UTC)no subject
Date: 2007-03-30 11:53 am (UTC)А в Яве есть финалайзеры. И вот это -- полный ПЦ.
no subject
Date: 2007-03-31 09:43 am (UTC)no subject
Date: 2007-03-30 12:33 pm (UTC)...для статических объектов.
no subject
Date: 2007-03-31 09:44 am (UTC)no subject
Date: 2007-03-31 09:09 pm (UTC)