Zrozum i zapobiegaj wyciekom pamięci w Delphi

DelfyObsługa programowania obiektowego jest bogata i wydajna. Klasy i obiekty pozwalają na programowanie kodu modułowego. Wraz z bardziej modułowymi i bardziej złożonymi komponentami są bardziej wyrafinowane i bardziej złożone błędy.

W trakcie rozwoju aplikacje w Delphi jest (prawie) zawsze fajna, zdarzają się sytuacje, w których czujesz, że cały świat jest przeciwko tobie.

Ilekroć musisz używać (tworzyć) obiekt w Delphi, musisz zwolnić pamięć, którą zużył (raz nie jest już potrzebny). Z pewnością bloki chroniące pamięć try / wreszcie mogą pomóc w zapobieganiu wyciekom pamięci; ochrona twojego kodu wciąż zależy od ciebie.

Wyciek pamięci (lub zasobu) występuje, gdy program traci możliwość zwolnienia pamięci, którą zużywa. Powtarzające się wycieki pamięci powodują wzrost zużycia pamięci przez proces bez ograniczeń. Wycieki pamięci są poważnym problemem - jeśli masz kod powodujący wyciek pamięci, w uruchomionej aplikacji 24/7 aplikacja zajmie całą dostępną pamięć i ostatecznie przestanie odpowiadać maszynie.

instagram viewer

Wycieki pamięci w Delphi

Pierwszym krokiem do uniknięcia wycieków pamięci jest zrozumienie, w jaki sposób one występują. Poniżej znajduje się dyskusja na temat niektórych typowych pułapek i najlepszych praktyk dotyczących pisania nie wyciekającego kodu Delphi.

W większości (prostych) aplikacji Delphi, w których używasz komponentów (Przyciski, Notatki, Edycje itp.), Które upuszczasz na formularzu (w czasie projektowania), nie musisz zbytnio przejmować się zarządzaniem pamięcią. Po umieszczeniu komponentu w formularzu forma staje się jego właściciel i zwolni pamięć zajętą ​​przez komponent po zamknięciu (zniszczeniu) formularza. Form, jako właściciel, jest odpowiedzialny za zwolnienie pamięci hostowanych komponentów. W skrócie: komponenty formularza są tworzone i niszczone automatycznie

Przykłady wycieków pamięci

W każdej nietrywialnej aplikacji Delphi będziesz tego chciał twórz instancje komponentów Delphi w czasie wykonywania. Będziesz także mieć własne klasy niestandardowe. Załóżmy, że masz klasę TDeveloper, który ma metodę DoProgram. Teraz, gdy potrzebujesz użyć klasy TDeveloper, tworzysz instancję klasy, wywołując metodę Stwórz metoda (konstruktor). Metoda Create przydziela pamięć dla nowego obiektu i zwraca odwołanie do obiektu.

var
zarko: TDeveloper
zaczynać
zarko: = TMyObject. Stwórz;
zarko. DoProgram;
koniec;

A oto prosty wyciek pamięci!

Za każdym razem, gdy tworzysz obiekt, musisz pozbyć się zajmowanej przez niego pamięci. Aby zwolnić pamięć przydzielonego obiektu, musisz wywołać Darmowy metoda. Aby być całkowicie pewnym, powinieneś również użyć bloku try / wreszcie:

var
zarko: TDeveloper
zaczynać
zarko: = TMyObject. Stwórz;
próbować
zarko. DoProgram;
Wreszcie
zarko. Darmowy;
koniec;
koniec;

To jest przykład bezpiecznego przydzielania pamięci i kodu dezalokacji.

Kilka słów ostrzeżenia: jeśli chcesz dynamicznie tworzyć instancję komponentu Delphi i jawnie go zwolnić później, zawsze przekaż zero jako właściciel. Niezastosowanie się do tego może spowodować niepotrzebne ryzyko, a także problemy z wydajnością i konserwacją kodu.

Oprócz tworzenia i niszczenia obiektów za pomocą metod Utwórz i zwolnij, musisz również zachować szczególną ostrożność, korzystając z zasobów „zewnętrznych” (plików, baz danych itp.).
Powiedzmy, że musisz operować na pliku tekstowym. W bardzo prostym scenariuszu, w którym metoda AssignFile służy do skojarzenia pliku na dysku z plikiem Po zakończeniu pracy z plikiem należy wywołać CloseFile, aby zwolnić uchwyt pliku, aby rozpocząć używany. W tym miejscu nie ma wyraźnego wezwania do „Free”.

var
F: TextFile;
S: string;
zaczynać
AssignFile (F, 'c: \ somefile.txt');
próbować
Readln (F, S);
Wreszcie
CloseFile (F);
koniec;
koniec;

Kolejny przykład obejmuje ładowanie zewnętrznych bibliotek DLL z kodu. Za każdym razem, gdy korzystasz z LoadLibrary, musisz wywołać FreeLibrary:

var
dllHandle: THandle;
zaczynać
dllHandle: = Loadlibrary ('MyLibrary. DLL ”);
// zrób coś z tą biblioteką DLL
jeśli dllHandle <> 0, to FreeLibrary (dllHandle);
koniec;

Wycieki pamięci w .NET?

Chociaż w Delphi dla .NET garbage collector (GC) zarządza większością zadań pamięciowych, możliwe jest przecieki pamięci w aplikacjach .NET. Oto dyskusja artykułu GC w Delphi dla platformy .NET.

Jak walczyć z wyciekami pamięci

Oprócz pisania modułowego kodu bezpiecznego dla pamięci, zapobieganie wyciekom pamięci można wykonać za pomocą niektórych dostępnych narzędzi innych firm. Delfy Narzędzia do usuwania wycieków pamięci pomóc złapać aplikację Delphi błędy takich jak uszkodzenie pamięci, wycieki pamięci, błędy alokacji pamięci, błędy inicjalizacji zmiennych, konflikty definicji zmiennych, błędy wskaźnika i inne.

instagram story viewer