
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (245) « Первая ... 221 222 [223] 224 225 ... 244 245 ( Перейти к последнему сообщению ) |
Сообщ.
#3331
,
|
|
|
Цитата --Ins-- @ Если я напишу Obj.Destroy (или Free, который вызывает Destroy внутри себя) - это деструктор, он вызовет не только тело Destroy, но и освободит память (TObject.FreeInstance). Если же я напишу inherited Destroy в перекрытом деструкторе потомка этого класса - это вызов Destroy как обычного метода, т.е. просто будет выполнено пустое тело. А память будет освобождена уже после отработки даже моего тела Destroy ![]() |
Сообщ.
#3332
,
|
|
|
Ошибся, отредактировал сообщение. Да, это висячая ссылка. нет AV по случайному стечению обстоятельств - менеджер памяти память пометил как неиспользованную, но физически не освободил Добавлено Цитата D_KEY @ Ну блин у вас и трешняк... На самом деле все логично и интуитивно понятно ![]() |
Сообщ.
#3333
,
|
|
|
Цитата --Ins-- @ На самом деле все логично и интуитивно понятно ![]() Я надеюсь, что могу оценить красоту или ущербность того или иного нового для меня архитектурного решения ![]() |
Сообщ.
#3334
,
|
|
|
Ну это просто повезло, пример-то тестовый. Сам объект в куче все еще существует, не перезатерт другим объектом.
|
![]() |
Сообщ.
#3335
,
|
|
Цитата --Ins-- @ На самом деле все логично и интуитивно понятно Не, вызов виртуальных методов из конструкторов и деструкторов, которое может привести к вызову метода, у которого уже был вызван деструктор и соответствующие методы очистки - ни разу не логично ![]() |
Сообщ.
#3336
,
|
|
|
Цитата --Ins-- @ Почему паскалисты/дельфисты пытаются себя убеждать, что паскаль/дельфи и их фичи - это что-то доселе невиданное и уму непостижимое для их оппонентов? Просто для тебя - это ново |
Сообщ.
#3337
,
|
|
|
Цитата trainer @ Ну это просто повезло, пример-то тестовый. Сам объект в куче все еще существует, не перезатерт другим объектом. Да я уже понял. Я просто поначалу подумал что там и память не освобождается физически при вызове FreeAndNil. |
Сообщ.
#3338
,
|
|
|
Цитата OpenGL @ Равно как и вызов деструктора для не полностью сконструированного объекта. Да же формулировки пошли как в прошлых холиварах ![]() ![]() |
Сообщ.
#3339
,
|
|
|
Цитата D_KEY @ Я надеюсь, что могу оценить красоту или ущербность того или иного нового для меня архитектурного решения А если бы вместо Obj.Destroy писалось бы destroy Obj (чтобы не было похоже на вызов метода), что бы это принципиально поменяло? ![]() |
Сообщ.
#3340
,
|
|
|
Кстати, в С++ теперь можно добиться вызова деструктора в случае исключения в конструкторе через делегирующий конструктор, это тоже уже обсуждали.
|
Сообщ.
#3341
,
|
|
|
Цитата OpenGL @ Не, вызов виртуальных методов из конструкторов и деструкторов, которое может привести к вызову метода, у которого уже был вызван деструктор и соответствующие методы очистки - ни разу не логично Равно как и вызов деструктора для не полностью сконструированного объекта. Это из-за того, что значения слов "коструктор/деструктор" в дельфи отличается от плюсовых представлений ![]() |
![]() |
Сообщ.
#3342
,
|
|
Цитата --Ins-- @ Для того, для кого ссылка на объект - это эквивалент объекта - да, так проще и понятнее Тебе напомнить, что в Делфи у объектов ссылочная семантика? Почему волшебным? Самым обычным. ![]() ![]() (struct object (slots) #:mutable) (define (new) (object (make-hasheq))) (define (free o) (set-object-slots! o 'nil)) (define (nil? o) (eq? (object-slots o) 'nil)) (define (main) (define a (new)) (define b a) (free a) (displayln (nil? a)) (displayln (nil? b))) ![]() ![]() > (main) #t #t Цитата --Ins-- @ Это следствие отсутствия автоматической сборки мусора для объектов, в этих условиях иначе сделать нельзя никак. Сборка мусора тут совершенно не при чем. При чем лишь устройство указателей. Ничто не мешает реализовать в языке с ручным управлением памятью чуть более косвенные указатели. Или хотя бы устройство объекта. |
Сообщ.
#3343
,
|
|
|
Цитата D_KEY @ Кстати, в С++ теперь можно добиться вызова деструктора в случае исключения в конструкторе через делегирующий конструктор, это тоже уже обсуждали. Ну, это логично. Было бы хуже, если бы деструктор не вызывался. И не надо забывать, что мы либо инициализируем поля, либо делегируем их инициализацию другому конструктору - смешать не получится. |
![]() |
Сообщ.
#3344
,
|
|
Цитата --Ins-- @ Это из-за того, что значения слов "коструктор/деструктор" в дельфи отличается от плюсовых представлений Ну, что в Дельфи все не как у людей, мы уже поняли ![]() |
Сообщ.
#3345
,
|
|
|
Цитата trainer @ Почему паскалисты/дельфисты пытаются себя убеждать, что паскаль/дельфи и их фичи - это что-то доселе невиданное и уму непостижимое для их оппонентов? Потому что они доселе это не видели и не понимают как это работает, и как-то не особо скрывают этого. Есть какие-то обрывочные сведения через призму своего восприятия, но когда узнают детали - удивляются, вот как сейчас - в десятый раз как в первый ![]() |