DelphiPodpora objektově orientovaného programování je bohatá a výkonná. Třídy a objekty umožňují programování modulárního kódu. Spolu s modulárnějšími a složitějšími komponenty přicházejí sofistikovanější a složitější hmyz.
Při vývoji aplikace v Delphi je (téměř) vždy zábavná, existují situace, kdy máte pocit, že celý svět je proti vám.
Kdykoli potřebujete použít (vytvořit) objekt v Delphi, musíte uvolnit paměť, kterou spotřeboval (jakmile již není potřeba). Bloky ochrany pamětí try / konečně vám jistě pomohou zabránit úniku paměti; je stále na vás, abyste svůj kód chránili.
K úniku paměti (nebo zdroje) dochází, když program ztratí schopnost uvolnit paměť, kterou spotřebuje. Opakované nevracení paměti způsobuje, že využití paměti procesu roste bez omezení. Únik paměti je vážným problémem - pokud máte kód způsobující nevracení paměti, v spuštěné aplikaci 24/7, aplikace spotřebuje veškerou dostupnou paměť a nakonec způsobí, že stroj přestane reagovat.
Únik paměti v Delphi
Prvním krokem, jak se vyhnout únikům paměti, je pochopit, jak k nim dochází. Následuje diskuse o některých běžných úskalích a osvědčených postupech při psaní nepronikajícího kódu Delphi.
Ve většině (jednoduchých) aplikací Delphi, kde používáte komponenty (tlačítka, poznámky, úpravy atd.), Které vložíte do formuláře (v době návrhu), se nemusíte příliš starat o správu paměti. Jakmile je komponenta umístěna na formuláři, stává se formulář jeho majitel a uvolní paměť, kterou komponenta přijme, jakmile je formulář uzavřen (zničen). Form, jako vlastník, je zodpovědný za dislokaci komponent, které hostil, do paměti. Zkrátka: komponenty ve formuláři jsou vytvářeny a ničeny automaticky
Příklady úniků paměti
V jakékoli netriviální aplikaci Delphi budete chtít instanci komponent Delphi za běhu. Budete mít také některé z vašich vlastních tříd. Řekněme, že máte třídu TDeveloper, která má metodu DoProgram. Nyní, když potřebujete použít třídu TDeveloper, vytvoříte instanci třídy voláním Vytvořit metoda (konstruktér). Metoda Vytvořit přiděluje paměť pro nový objekt a vrací odkaz na objekt.
var
zarko: TDeveloper
začít
zarko: = TMyObject. Vytvořit;
zarko. DoProgram;
konec;
A tady je jednoduchý únik paměti!
Kdykoli vytvoříte objekt, musíte zlikvidovat paměť, kterou zabíral. Chcete-li uvolnit paměť přiděleného objektu, musíte zavolat Volný, uvolnit metoda. Chcete-li si být naprosto jistí, měli byste také použít blok try / konečně:
var
zarko: TDeveloper
začít
zarko: = TMyObject. Vytvořit;
Snaž se
zarko. DoProgram;
Konečně
zarko. Volný, uvolnit;
konec;
konec;
Toto je příklad bezpečného přidělení paměti a kódu deallocation.
Některá varovná slova: Pokud chcete dynamicky vytvořit instanci komponenty Delphi a explicitně ji uvolnit někdy později, vždy předejte jako majitel nulovou hodnotu. Pokud tak neučiníte, může to představovat zbytečné riziko a problémy s výkonem a údržbou kódu.
Kromě vytváření a ničení objektů pomocí metod Create a Free musíte být také velmi opatrní při použití „externích“ (souborů, databází atd.) Zdrojů.
Řekněme, že musíte pracovat s některým textovým souborem. Ve velmi jednoduchém scénáři, kde se k přiřazení souboru na disku k souboru používá metoda AssignFile Po dokončení souboru musíte zavolat CloseFile a uvolnit popisovač souboru použitý. Zde nemáte výslovný hovor „Zdarma“.
var
F: TextFile;
S: řetězec;
začít
AssignFile (F, 'c: \ somefile.txt');
Snaž se
Readln (F, S);
Konečně
CloseFile (F);
konec;
konec;
Další příklad zahrnuje načtení externích DLL z vašeho kódu. Kdykoli používáte LoadLibrary, musíte zavolat FreeLibrary:
var
dllHandle: THandle;
začít
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// něco s touto DLL
pokud dllHandle <> 0, pak FreeLibrary (dllHandle);
konec;
Únik paměti v .NET?
Přestože u Delphi for .NET řídí sběratel odpadu (GC) většinu úloh paměti, je možné mít v aplikacích .NET úniky paměti. Zde je diskuse o článku GC v Delphi pro .NET.
Jak bojovat proti únikům paměti
Kromě psaní modulárního kódu bezpečného paměti lze zabránit úniku paměti pomocí některých dostupných nástrojů třetích stran. Delphi Nástroje pro opravu paměti vám pomohou chytit aplikaci Delphi chyby například poškození paměti, nevracení paměti, chyby přidělení paměti, chyby inicializace proměnných, konflikty definice proměnných, chyby ukazatele a další.