Автоматическое удаление временных объектов
Добавлено: 06.07.2017 23:43:52
Всем привет. Давно не заходил на форум. Вот, решил выложить на github одно решение, которое давно в голове крутилось.
Иногда в функции требуется создавать временные объекты. Всякие там TList, TStrings, TStream... Ну и удалить их надо в конце. Причём правила хорошего тона требуют, чтобы объекты были удалены даже если исключение случилось. Значит в try/finally надо оборачивать. Всё ничего, пока объектов 1-2. Если 5-6 или 10, то всё уже не так красиво.
Вот и придумалось решение хранить ссылки на них в автоуправляемом компилятором объекте, который будет удалять их, когда объект покидает область видимости и компилятор удаляет его. Примерно так:
и всё. На "end;" MyList автоматически удаляется. А. Ну ещё там есть другие методы, вроде GetMem, которые работают как системная функция, но выделяют память, которая автоматически освободиться при выходе из функции.
Предлагаю желающим заценить реализацию и сказать что думаете...
Иногда в функции требуется создавать временные объекты. Всякие там TList, TStrings, TStream... Ну и удалить их надо в конце. Причём правила хорошего тона требуют, чтобы объекты были удалены даже если исключение случилось. Значит в try/finally надо оборачивать. Всё ничего, пока объектов 1-2. Если 5-6 или 10, то всё уже не так красиво.
Вот и придумалось решение хранить ссылки на них в автоуправляемом компилятором объекте, который будет удалять их, когда объект покидает область видимости и компилятор удаляет его. Примерно так:
- Код: Выделить всё
var
Scoped: TScoped;
MyList: TList;
begin
MyList := Scoped[TList.Create] as TList;
<...>
end;
и всё. На "end;" MyList автоматически удаляется. А. Ну ещё там есть другие методы, вроде GetMem, которые работают как системная функция, но выделяют память, которая автоматически освободиться при выходе из функции.
Предлагаю желающим заценить реализацию и сказать что думаете...