vložil Radek Červinka
27. srpna 2016 00:23
Při jedné konzultaci jsem našel zajímavou chybu v jedné části zákazníkova programu. Myslím, že je to pěkný příklad.
//LEAK !
var
ads: TADOQuery;
begin
ads := TADOQuery.Create(nil);
ads.Connection := ADOConnection1;
with ads, SQL do
begin
try
Text := 'SELECT * FROM tCRM_Currency';
Open;
try
while not Eof do
begin
//………..
Next;
end;
finally
Close;
end;
finally
Free;
end;
end;
end;
Zkuste ji první najít samostatně.
Myslím si, že použití with je pěšina do pekla. Vícenásobné with (nebo vnořené) je pak už dálnicí.
Pokud to není jasné, tak Free je voláno nad SQL, což je TStringList. Mimochodem chyba mohla vzniknout i např. při migraci z jiných komponent, které nemají SQL jako třídu a autor si chtěl ušetřit práci, tj. nemusela to být přímo chyba při originálním vývoji.
Každopádně každé použití with dobře zvažte, nikdy nevíte kdy se něco přidá do with-nuté části a Váš kód bude dělat něco jiného. Lokální proměnná je dost dobré řešení a lepší se s ní pak i pracuje při ladění (dá se např. zobrazit v debuggeru).