Небольшая заметка по книге Delphi Memory Management.
Ниже перечислены методы освобождения объектов при ручном управлении памятью.
Destroy
В основе всего лежит virtual метод Destroy класса TObject
1 2 3 4 5 6 7 8 9 |
TObject = class public ... destructor Destroy; virtual; ... end; destructor TObject.Destroy; begin end; |
Пользуемся им, например так…
1 2 3 4 5 6 7 8 9 10 11 |
procedure HelloDestroy; var sl: TStringList; begin sl := TStringList.Create; try sl.Add('Hello World'); finally sl.Destroy; end; end; |
Free (с проверкой на nil)
Самый популярный способ, на мой взгляд
1 2 3 4 5 |
procedure TObject.Free; begin if Self <> nil then Destroy; end; |
DisposeOf
Появился в XE4 и создан для совместимости
FreeAndNil
Не потокобезопасный (позволяет 2 потокам войти в деструктор экземпляра)
Не типобезопасный, данный код приведет к AV
1 2 3 4 |
var Ref: IInterface; Ref := TInterfacedObject.Create; FreeAndNil(Ref); |
Обнуляет одну и только одну ссылку – тут очевидно, если на объект у нас ссылается несколько ссылок, то обнулится лишь одна.