Ostatnio przeglądałem dość sporo modułów ze źródeł biblioteki standardowej Free Pascala i biblioteki LCL; Natrafiłem tam na co najmniej dwa odmienne sposoby tworzenia obiektów i zabezpieczania kodu przed wyciekami pamięci, za pomocą bloków Try Finally;
Pierwszy sposób:
someObject := TSomeClass.Create();
try
// użycie obiektu
finally
someObject.Free();
end;
Drugi sposób, rzadziej spotykany:
someObject := nil;
try
someObject := TSomeClass.Create();
// użycie obiektu
finally
someObject.Free();
end;
Różnica polega na tym, że w pierwszym przykładzie konstruktor nie jest zabezpieczony i nie wiadomo (przynajmniej ja nie wiem) co stanie się, jeśli konstruktor rzuci wyjątek; W drugim kodzie zmienna najpierw jest **Nil**owana, a konstruktor wywoływany jest już wewnątrz bloku Try Finally, dzięki czemu w razie rzucenia wyjątku przez konstruktor lub dlaszy kod po nim, metoda Free zostanie zawsze wywołana;
I tu moje pytanie - czy ktokolwiek korzysta z tego drugiego sposobu i czy taki zapis (drugi) ma jakiś sens?
Do tej pory wszędzie używałem sposobu z pierwszego przykładu (o ile instancja klasy miała być zwalniana w tym samym bloku kodu, np. w metodzie) i sprawdzał się dobrze; Jednak widząc inne sposoby nabieram wątpliwości co do wady korzystania z tej (pierwszej) konstrukcji; Oczywiście tylko w przypadku, gdy konstruktor wykonuje jakieś niepewne operacje, np. ładowanie pliku, gdzie klasa może rzucić wyjątek.