В классах есть три вещи, которые делают эту идиому безопасной и простой:
- На этапе выделения памяти конструктору (до запуска реального тела конструктора) поля ссылки на класс инициализируютсяна ноль.
- Когда в конструкторе возникает исключение, деструктор вызывается автоматически.
- Всегда безопасно вызывать
Free
для нулевой ссылки, поэтому вам не нужно проверять Assigned
first.
Поскольку деструктор может полагаться на то, что все поля имеют известные значения, он может безопасно вызывать Free
во всем, независимо от того, как далеко зашел конструктор до сбоя.Каждое поле будет содержать действительную ссылку на объект или оно будет нулевым, и в любом случае его можно безопасно освободить.
constructor TDoSomething.Create;
begin
Resource1 := AcquireResource1;
Resource2 := AcquireResource2;
Resource3 := AcquireResource3;
end;
destructor TDoSomething.Destroy;
begin
Resource1.Free;
Resource2.Free;
Resource3.Free;
end;
Используйте его так же, как и любой другой класс:
Context := TDoSomething.Create;
try
Context.UseResources;
finally
Context.Free;
end;