powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Если в конструкторе произойдет исключение, то вызывается деструктор?
21 сообщений из 71, страница 3 из 3
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797193
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonНе понял, при чем здесь FreeAndNil? Ну юзал бы ты Free вместо FreeAndNil стало бы легче? Всё равно бы полез к разрушенной ссылке.
Да, стало бы легче, вернее - совсем хорошо.
Никакого обращения "к разрушенной ссылке" не было бы.
А так - FreeAndNil вначале присвоил ссылке nil, а затем вызвал деструктор, внутри которого происходило обращение к этому объекту по этой ссылке (которая уже nil, а была равна Self).
Теперь понятнее стало? :)
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797427
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797428
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRock,

то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?Ну да
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797490
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть того, что деструктор вызовется неявно при ошибке в конструкторе, это очевидно...

Предположим что неявного вызова деструктора нет.
Рассмотрим несколько кейсов.
Код: pascal
1.
2.
var A := TObject.Create();  // 1
A.Free();  // 2


Если в строке 1 будет Exception, то строка 2 никогда не выполнится и ресурсы выделенные в конструкторе до ошибки не освободятся


Код: pascal
1.
2.
3.
4.
5.
  try
    var A := TObject.Create();
  finally
    A.Free();
  end;


Если в конструкторе будет исключение, то присвоение в переменную А не будет выполнено. Следовательно строка в finally не валидная, т.к. А смотрит в никуда... Следовательно ресурсы выделенные в конструкторе до ошибки не освободятся

В связи с этим логично, что раз присвоения в А нет, но как-то надо реализовать освобождение ресурсов и в этом блоке кода адреса экземпляра нет, то деструктор вызывается неявно, т.к. компилятор в принципе знает об этом.

Поэтому деструкторы надо писать исходя из того, что в конструкторе на любом этапе может вылететь исключение
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797539
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockmakhaonYuRock,

то есть ты в деструкторе как-то умудрился к конкретному экземпляру обратиться, а не к селфу?Ну да


Ну кто тебе тогда виноват?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797653
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X-Citeдеструктор вызовется неявно при ошибке в конструкторе, это очевидно...
Код: pascal
1.
2.
3.
4.
5.
  try
    var A := TObject.Create();
  finally
    A.Free();
  end;



Это наглядный пример, как в delphi используются "очевидные" вещи. Когда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно.
Це "очевидно" для Delphi ? Ась... ?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797665
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.ProgramerЭто наглядный пример, как в delphi используются "очевидные" вещи. Когда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно.
Це "очевидно" для Delphi ? Ась... ?Это очевидо подтверждает утверждение, что сдуру можно и член сломать. Вне зависимости от языка.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39797670
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.ProgramerКогда в конструкторе происходит исключение, то A.Free() - вызывается 2(два) раза, сначала неявно, а затем явно.
Це "очевидно" для Delphi ? Ась... ?
Неверно.. В finally в A будет лежать мусор, а не экземпляр класса.. Присвоение то не выполнится
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798795
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕМНИП там нормальный nil будет. Ну потому что конструктор всегда выполняется в неявном try-блоке. Потому что Pascal один из немногих языков, что для людей делался.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798920
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarЕМНИП там нормальный nil будет.Там будет мусор из стека. В зависимости от расположения звезд, где-то в 60-80% случаев там окажется nil
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798970
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BeltarЕМНИП там нормальный nil будет. Ну потому что конструктор всегда выполняется в неявном try-блоке. Потому что Pascal один из немногих языков, что для людей делался.
Есть два очевидных варианта
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  var A := nil;
  try
    A := TObject.Create();
    ...
  finally
    A.Free();
  end;


и
Код: pascal
1.
2.
3.
4.
5.
6.
  var A := TObject.Create();
  try
    ...
  finally
    A.Free();
  end;


или я что-то не понимаю?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798990
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

внимательно прочитай 21854330 , это доказательство "от противного"
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39798993
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRockпропущено...
Ну да


Ну кто тебе тогда виноват?
Это не важно, кто виноват. Это был просто пример, когда FreeAndNil опаснее o.Free; o := nil.

И, да, естественно, обращение к конкретному экземпляру было не между begin end деструктора, а глубоко в недрах, т.ч. не всё так очевидно было и легко, как кажется.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799000
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

это пример твоего кривого кода. FreeAndNil всего лишь обозначил проблему.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799001
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonYuRock,

это пример твоего кривого кода. FreeAndNil всего лишь обозначил проблему.Обозначил, да, и это хорошо, я ж не спорю.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799003
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)roschinspb,

внимательно прочитай 21854330 , это доказательство "от противного" спс, ясно...
Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799004
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stНа форуме встретил эту фразу:
“Если в конструкторе произойдет исключение, то неявно вызовется деструктор”

Ссыль на тему
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799018
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

arc оказался настолько хорош, что от него решили в линуксе отказаться :)
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799031
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspbkealon(Ruslan)roschinspb,

внимательно прочитай 21854330 , это доказательство "от противного" спс, ясно...
Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT в этом виноват Borland (не местный модератор, а компания), они не описали чётко стандарт языка, который придумали
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799212
Фотография roschinspb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)roschinspbпропущено...
спс, ясно...
Эх блин это если до сих пор с Create, Destroy, Free, FreeAndNil холивары идут, это ж какой разрыв шаблона будет если задуматься о DisposeOf, [weak] и AUTOREFCOUNT в этом виноват Borland (не местный модератор, а компания), они не описали чётко стандарт языка, который придумали
А надо было отлить в граните и поставить в музей? :o) Любое развитие — это отклонение от стандарта.
Вообще говоря, во времена борланд развитие было довольно логичным и адекватным, потом начался разброд и шатание.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39799590
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roschinspb,

т.е. если следовать этой логике, то стандарты плюсов писали старые п***, в качестве мемуаров?
...
Рейтинг: 0 / 0
21 сообщений из 71, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Если в конструкторе произойдет исключение, то вызывается деструктор?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]