Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40057843&tid=2037300]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
161ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 287ms |

| 0 / 0 |
