Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Реализовал (по работе) механизм, который позволяет автоматически уничтожать объекты. Избавляет от необходимости использования try..finally для удаления объектов. Пример кода: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. TSmartHolder - это простейший рекорд с единственным полем (интерфейсная ссылка). Соответственно, все объекты будут уничтожены, как только интерфейсная ссылка будет обнулена, т.е. при выходе рекорда из области видимости. Работает, начиная с Delphi 2007. На мой взгляд, штука очень удобная. Если есть интерес, я могу это оформить на своём аккаунте в гитхабе в виде отдельного модуля. С другой стороны, не исключаю, что вариантов реализации данного велосипеда уже множество (но мне до сих пор не попадалось) :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 12:33 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Умный указатель через reference to function интереснее... там даже подсказчик кода работает и синтаксис использования не меняется, кроме объявления... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 13:59 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
X-Cite Умный указатель через reference to function интереснее... там даже подсказчик кода работает и синтаксис использования не меняется, кроме объявления... Где посмотреть на это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:03 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
DmSer TSmartHolder - это простейший рекорд с единственным полем (интерфейсная ссылка). DmSer На мой взгляд, штука очень удобная. Код: pascal 1. DmSer На мой взгляд, штука очень удобная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:07 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
ИМХО это не красиво и не очень удобно. Не надо связываться с интерфейсами, где это явно не требуется. В конце концов если сильно хочется - используй рекорды. Благо там теперь и конструктор с деструктором есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:15 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Тогда ты ее постоянно перезаписываешь. Или там у тебя какой-то IInterfacedList? Там объект, который хранит список зарегистрированных объектов в TList. Объект реализует интерфейс. В рекорде хранится интерфейсная ссылка на этот объект. Если изменить требование D2007 на D2009, то RegObj можно объявить дженерик методом и уйти от каста Можно, как вариант. Иногда последовательность уничтожения объектов важна Разные ситуации бывают, конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:20 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
rgreat ИМХО это не красиво и не очень удобно. Не надо связываться с интерфейсами, где это явно не требуется. В конце концов если сильно хочется - используй рекорды. Благо там теперь и конструктор с деструктором есть. В коде нет явной работы с интерфейсами (см. пример в начале). Всё спрятано в методы рекорда. Интерфейсная ссылка объявлена как private. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:23 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. В последних версиях сломали правда CodeInsight... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:27 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Использование RegObj выглядит не очень красиво. К сожалению. Тут ничего не поделаешь. Но такой код смотрится вполне прилично: Код: pascal 1. можно так: Код: pascal 1. 2. У меня в коде есть классы, которые я чаще всего использую (назовём их "типовые классы"). Для них сделал функции создания объекта (CreateStringList, CreateList и т.п.). Иногда добавляю новые функции по мере необходимости. Но это свой фирменный велосипед :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:31 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
X-Cite, Код: pascal 1. 2. 3. 4. 5. Зачем?.. Почему не Free? Ну и каждое обращение к переменной - вызов функции, ну такое себе. Хотя надо смотреть как компилятор вызов заинлайнит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:31 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
alekcvp, Да все равно... Можно и Free Ну это уже проблемы компилятора, если он не сможет заинлайнить))) За сомнительное удобство, не из коробки, надо платить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:41 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
alekcvp Хотя надо смотреть как компилятор вызов заинлайнит. Это же интерфейс, откуда там инлайну взяться. Однако, прикольное колдунство :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 14:45 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
var x: ISmartPointer<TForm2>; begin x := TSmartPointer<TForm2>.Create(TForm2.Create(nil)); Не заметил особого преимущества по сравнению с Код: pascal 1. 2. 3. 4. 5. А пытаться понять как работает ISmartPointer - ещё сложнее, чем разобраться с фильмом Довод :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 15:07 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
DmSer Не заметил особого преимущества Если правильно помню, эту запись: Код: pascal 1. можно сократить до: Код: pascal 1. или вообще создание смартпоинтера завернуть в функцию, например: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 15:17 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey можно сократить до: 1. TSmartPointer и TSmartPointer<T> - это разные типы. 2. Можно было бы писать Код: pascal 1. но это вам не джава и автовывод типов сюда не завезли Kazantsev Alexey или вообще создание смартпоинтера завернуть в функцию, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 15:28 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Нельзя. 1. TSmartPointer и TSmartPointer<T> - это разные типы. Верно, только не специализированных дженериков не бывает. _Vasilisk_ но это вам не джава и автовывод типов сюда не завезли Да, это я с выводом типов для дженериковых методов спутал. _Vasilisk_ Нельзя. Дженерик-функций не бывает А это я с FPC спутал, там они есть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 15:37 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
DmSer, в любом случае если у тебя появляется AS, значит код уже сразу выглядит аналогично тому как звучит нельзя использовать хаки везде подряд, карма портится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 15:44 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Kazantsev Alexey можно сократить до: 1. TSmartPointer и TSmartPointer<T> - это разные типы. 2. Можно было бы писать Код: pascal 1. но это вам не джава и автовывод типов сюда не завезли Kazantsev Alexey или вообще создание смартпоинтера завернуть в функцию, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 15:46 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) DmSer, в любом случае если у тебя появляется AS, значит код уже сразу выглядит аналогично тому как звучит нельзя использовать хаки везде подряд, карма портится Мы пока на D2007 работаем. Деваться некуда :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 15:51 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Нельзя. Дженерик-функций не бывает Бывают) Код: pascal 1. 2. 3. 4. Например так :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 16:39 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
А вообще в Spring 4D реализованы smart pointers на вкус и цвет.. Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 16:44 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
X-Cite Да все равно... Можно и Free а если останется ссылка и ты будешь проверять и обращаться? будет AV думаю, FreeAndNil - правильный всегда вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 18:34 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
X11 X-Cite Да все равно... Можно и Free а если останется ссылка и ты будешь проверять и обращаться? будет AV думаю, FreeAndNil - правильный всегда вариант Какая ссылка, если речь идёт о деструкторе?.. Если у тебя после этого останется ссылка, к которой ты будешь обращаться, то ты ССЗБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 19:27 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
после Free остается ссылка не зря ведь придумали FreeAndNil Код: pascal 1. 2. 3. 4. По идее Assigned(o) вернет True ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 19:46 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
X11 после Free остается ссылка не зря ведь придумали FreeAndNil Код: pascal 1. 2. 3. 4. По идее Assigned(o) вернет True А не надо так делать. Вообще с Assigned надо быть очень аккуратным и точно знать как работает то что туда передаешь. Ибо если не уверен на 100% что в o может быть либо живой объект либо nil то Assigned применять вообще нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 20:06 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
rgreat, зачем мне Assigned если я буду уверен, что там всё хорошо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 20:19 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) rgreat, зачем мне Assigned если я буду уверен, что там всё хорошо? "Хорошо" - это 100% уверенность в том что по указателю не может быть мусора. Только либо живой объект либо nil. Если 100% уверенности в таком нет, то и Assign использовать никак нельзя. Разве что так: Код: pascal 1. 2. 3. 4. 5. 6. Но тут и assign-то нужен только для того что бы тормозило меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 20:42 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
X11 после Free остается ссылка Тебе не всё равно что там останется, если после вызова деструктора ссылка на сам интерфейс будет невалидной?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 23:04 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
В методах такая фишка с автоуничтожением бесполезна, как по мне -- там у программиста полный контроль. А вот в сложных схемах, где создание и уничтожение разделены во времени и месту -- может пригодиться. Например, я аналог такого объекта использовал для сборки и корректного уничтожения созданных ресурсов при завершении/закрытии приложения, когда оно может быть завершено в любой момент, а проверять вручную каждый ресурс накладно/муторно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2021, 23:48 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
А вообще, есть одна задача, где автоуничтожение могло быть полезно (если натянуть сову на глобус): если у нас есть список объектов, но при этом часть из них должно быть уничтожено (к примеру, мы туда копии/временные значения помещаем). Иногда встречалось подобное, решалось созданием отдельного списка для хранения временных объектов, который потом и уничтожался. Пример: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 00:02 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
DmSer TSmartHolder - это простейший рекорд с единственным полем (интерфейсная ссылка). Ну и зачем тебе трёхколёсный цирковой велосипед? 16620568 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 00:04 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
JayDi В методах такая фишка с автоуничтожением бесполезна, как по мне Наоборот. Она полезна примерно в той же степени, что и исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 00:06 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
rgreat "Хорошо" - это 100% уверенность в том что по указателю не может быть мусора. Только либо живой объект либо nil. Ну, если кто-то программирует без подобной уверенности, он... рисковый чувак с тягой к гомосексуальным контактам, назовём так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 00:07 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
встречалась минимум пара реализаций (без пруфов), но... "запас карман не тяготит"(c) - DmSer могу это оформить на своём аккаунте в гитхабе в виде отдельного модуля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 05:58 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
rgreat X11 после Free остается ссылка не зря ведь придумали FreeAndNil Код: pascal 1. 2. 3. 4. По идее Assigned(o) вернет True А не надо так делать. Вообще с Assigned надо быть очень аккуратным и точно знать как работает то что туда передаешь. Ибо если не уверен на 100% что в o может быть либо живой объект либо nil то Assigned применять вообще нельзя. а как жеж тогда проверить существование объекта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 08:24 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
alekcvp X11 после Free остается ссылка Тебе не всё равно что там останется, если после вызова деструктора ссылка на сам интерфейс будет невалидной?.. в том-то и дело, что при повторном использовании не все равно - надо знать и быть уверенным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 08:25 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Такой код мне кажется более читабельным: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. Src: https://forum.lazarus.freepascal.org/index.php/topic,37524.msg252351.html#msg252351 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 09:22 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
И что бенчмарк показывает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 09:25 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
wadman, вот только контроль типов исчезает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 09:32 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Тоже добавлю свой вариант, банальный. Сахара не прикручивал, т.к. особо и не понадобилось пока Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2021, 10:42 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Выложил на github исходники TSmartHolder. На мой взгляд - очень удобная и надежная штука. Отлаживал только методы RegObj, FreeObj и Clear. Надеюсь и остальное всё работает. В последние пол года я в своих проектах (на работе) практически не использую try..finally для контроля уничтожения объектов. Стараюсь использовать TSmartHolder. Скорее всего производительность будет чуть хуже, чем при try..finally, зато работать в коде, не замусоренном try..finally, намного приятнее. Исходники получились очень простые, 300 строк, из них 100 - это реализация FastStringReplace, скопипасченная отсюда . Для новых версий Delphi она разумеется не нужна, там и обычный StringReplace is very fast! Пример использования: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2021, 21:05 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
DmSer> Стараюсь использовать TSmartHolder Я код не читал, но что именно он делает - тупо уничтожает все ссылки в деструкторе? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2021, 22:08 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
В новых средах удобно вот так: TArray<TBitmap> чистка памяти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2021, 22:39 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
makhaon, Рекорды не всегда удобны, к сожалению. Те же сеттеры в пропертях не умеют нормально работать с рекордами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2021, 23:02 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
rgreat, не панацея, спорить не буду. однако местами очень удобны. к слову из фишек в отличие от интерфейсов гарантируют финализацию всего даже при исключениях в финализаторах. то есть полноценная замена лестниц try/finally. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2021, 23:22 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам DmSer> Стараюсь использовать TSmartHolder Я код не читал, но что именно он делает - тупо уничтожает все ссылки в деструкторе? Хранит интерфейсную ссылку ISmartHolder. Плюс предоставляет несколько удобных методов для создания типовых объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2021, 23:42 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
makhaon В новых средах удобно вот так: TArray<TBitmap> чистка памяти А что будет, если один такой рекорд скопировать в другой рекорд? Потом объект по 2 раза будет уничтожаться и ещё плюс утечка будет? Тогда нужно и операцию присвоения переопределять. Граблей, чувствуется, будет не мало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2021, 09:49 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
DmSer, операция присвоения переопределяется, если нужно. ну и вообще надо поглядывать за записями. а так то очень удобно, переписал у себя большинство try/finally лестниц в подобном стиле. более того, так удобно не только создавать/разрушать инстансы, но и работать с любыми другими глобальными переменными/экземплярами. я так, например, извлекаю и возвращаю в пулл коннекты к базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2021, 16:17 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
makhaon DmSer, операция присвоения переопределяется, если нужно. ну и вообще надо поглядывать за записями. а так то очень удобно, переписал у себя большинство try/finally лестниц в подобном стиле. более того, так удобно не только создавать/разрушать инстансы, но и работать с любыми другими глобальными переменными/экземплярами. я так, например, извлекаю и возвращаю в пулл коннекты к базе. Насчёт пулов к БД - не уверен, что так правильно. Даже в C# работа с ресурсами выполняется в рамках отдельного блока (using). Всегда понятно, в какой момент закроется подключение / датасет / файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.05.2021, 16:30 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
DmSer makhaon DmSer, операция присвоения переопределяется, если нужно. ну и вообще надо поглядывать за записями. а так то очень удобно, переписал у себя большинство try/finally лестниц в подобном стиле. более того, так удобно не только создавать/разрушать инстансы, но и работать с любыми другими глобальными переменными/экземплярами. я так, например, извлекаю и возвращаю в пулл коннекты к базе. Насчёт пулов к БД - не уверен, что так правильно. Даже в C# работа с ресурсами выполняется в рамках отдельного блока (using). Всегда понятно, в какой момент закроется подключение / датасет / файл. У меня тоже понятно. Как из области видимости вышло - так и закрылось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2021, 05:08 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
X-Cite, Крутая реализация! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2021, 08:37 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
makhaon У меня тоже понятно. Как из области видимости вышло - так и закрылось. В принципе, в C++ практикуется такой подход. Там же по стандарту нету исключений и try..finally, вот и приходится подобные шаблоны использовать в качестве альтернативы try..finally. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2021, 09:12 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Такой подход тоже вполне рабочий: Код: pascal 1. Но нужно понимать, что работает он за счёт временной переменной (интерфейсной ссылки), которую компилятор вставляет в месте каждого вызова функции Auto. На данный момент компилятор Delphi чистит эти временные переменные только при выходе из функции. Но что, если поведение завтра изменится? Вполне могут решить, что раз временная переменная не используется, можно её сразу занилить. В Лазарусе вроде так и сделали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2021, 20:18 |
|
||
|
Автоматическое уничтожение объектов
|
|||
|---|---|---|---|
|
#18+
Адаптировал TSmartHolder под Lazarus. Вроде кроме MODE DELPHI ничего не потребовалось. Проверил вариант "Auto().Instance" - под лазарусом оно не работает. Предположительно там используется одна временная интерфейсная ссылка на все вызовы функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2021, 08:33 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037300]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
166ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 10ms |
| total: | 295ms |

| 0 / 0 |
