DelphiDie Unterstützung für objektorientierte Programmierung ist umfangreich und leistungsstark. Klassen und Objekte ermöglichen eine modulare Code-Programmierung. Zusammen mit modulareren und komplexeren Komponenten kommen anspruchsvollere und komplexere Fehler.
Während der Entwicklung Anwendungen in Delphi macht (fast) immer Spaß, es gibt Situationen, in denen Sie das Gefühl haben, die ganze Welt sei gegen Sie.
Wann immer Sie ein Objekt in Delphi verwenden (erstellen) müssen, müssen Sie den verbrauchten Speicher freigeben (einmal nicht mehr benötigt). Sicherlich können die Speicherschutzblöcke try / finally dazu beitragen, Speicherlecks zu vermeiden. Es liegt immer noch an Ihnen, Ihren Code zu schützen.
Ein Speicherverlust (oder Ressourcenverlust) tritt auf, wenn das Programm die Fähigkeit verliert, den von ihm verbrauchten Speicher freizugeben. Wiederholte Speicherverluste führen dazu, dass die Speichernutzung eines Prozesses unbegrenzt wächst. Speicherverluste sind ein ernstes Problem - wenn in einer Anwendung ein Code einen Speicherverlust verursacht Die Anwendung verbraucht rund um die Uhr den gesamten verfügbaren Speicher und lässt die Maschine schließlich nicht mehr reagieren.
Speicherlecks in Delphi
Der erste Schritt zur Vermeidung von Speicherlecks besteht darin, zu verstehen, wie sie auftreten. Was folgt, ist eine Diskussion über einige häufige Fallstricke und Best Practices für das Schreiben von nicht leckendem Delphi-Code.
In den meisten (einfachen) Delphi-Anwendungen, in denen Sie die Komponenten (Schaltflächen, Memos, Änderungen usw.) verwenden, die Sie (zur Entwurfszeit) auf einem Formular ablegen, müssen Sie sich nicht zu sehr um die Speicherverwaltung kümmern. Sobald die Komponente in einem Formular platziert ist, wird das Formular zu seinem Inhaber und gibt den von der Komponente belegten Speicher frei, sobald das Formular geschlossen (zerstört) wird. Form ist als Eigentümer für die Speicherfreigabe der von ihm gehosteten Komponenten verantwortlich. Kurz gesagt: Komponenten in einem Formular werden automatisch erstellt und zerstört
Beispiele für Speicherlecks
In jeder nicht trivialen Delphi-Anwendung möchten Sie Instanziieren Sie Delphi-Komponenten zur Laufzeit. Sie werden auch einige Ihrer eigenen benutzerdefinierten Klassen haben. Angenommen, Sie haben einen TDeveloper der Klasse mit einer DoProgram-Methode. Wenn Sie jetzt die TDeveloper-Klasse verwenden müssen, erstellen Sie eine Instanz der Klasse, indem Sie die aufrufen Erstellen Methode (Konstruktor). Die Create-Methode reserviert Speicher für ein neues Objekt und gibt einen Verweis auf das Objekt zurück.
var
zarko: TDeveloper
Start
zarko: = TMyObject. Erstellen;
Zarko. DoProgram;
Ende;
Und hier ist ein einfacher Speicherverlust!
Wenn Sie ein Objekt erstellen, müssen Sie über den von ihm belegten Speicher verfügen. Um den Speicher eines zugewiesenen Objekts freizugeben, müssen Sie das aufrufen Kostenlos Methode. Um ganz sicher zu sein, sollten Sie auch den try / finally-Block verwenden:
var
zarko: TDeveloper
Start
zarko: = TMyObject. Erstellen;
Versuchen
Zarko. DoProgram;
schließlich
Zarko. Kostenlos;
Ende;
Ende;
Dies ist ein Beispiel für eine sichere Speicherzuweisung und einen Freigabecode.
Einige warnende Worte: Wenn Sie eine Delphi-Komponente dynamisch instanziieren und später explizit freigeben möchten, übergeben Sie immer nil als Eigentümer. Andernfalls können unnötige Risiken sowie Probleme mit der Leistung und der Codewartung entstehen.
Neben dem Erstellen und Zerstören von Objekten mit den Methoden Create und Free müssen Sie auch sehr vorsichtig sein, wenn Sie "externe" Ressourcen (Dateien, Datenbanken usw.) verwenden.
Angenommen, Sie müssen eine Textdatei bearbeiten. In einem sehr einfachen Szenario, in dem die AssignFile-Methode verwendet wird, um eine Datei auf einer Festplatte einer Datei zuzuordnen Wenn Sie mit der Datei fertig sind, müssen Sie CloseFile aufrufen, um das Dateihandle freizugeben benutzt. Hier haben Sie keinen expliziten Aufruf zu "Free".
var
F: TextFile;
S: Zeichenfolge;
Start
AssignFile (F, 'c: \ somefile.txt');
Versuchen
Readln (F, S);
schließlich
CloseFile (F);
Ende;
Ende;
Ein weiteres Beispiel ist das Laden externer DLLs aus Ihrem Code. Wann immer Sie LoadLibrary verwenden, müssen Sie FreeLibrary aufrufen:
var
dllHandle: THandle;
Start
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// Mach etwas mit dieser DLL
wenn dllHandle <> 0, dann FreeLibrary (dllHandle);
Ende;
Speicherlecks in .NET?
Obwohl mit Delphi für .NET der Garbage Collector (GC) die meisten Speicheraufgaben verwaltet, kann es in .NET-Anwendungen zu Speicherlecks kommen. Hier ist eine Artikeldiskussion GC in Delphi für .NET.
Wie man gegen Speicherlecks kämpft
Neben dem Schreiben von modularem speichersicherem Code können Speicherlecks mithilfe einiger der verfügbaren Tools von Drittanbietern verhindert werden. Delphi Tools zur Behebung von Speicherlecks helfen Ihnen, Delphi-Anwendung zu fangen Fehler B. Speicherbeschädigung, Speicherlecks, Speicherzuordnungsfehler, Variableninitialisierungsfehler, Variablendefinitionskonflikte, Zeigerfehler und mehr.