@sirRufo Was will uns der Dichter damit sagen?
Das war eine Antwort auf die Beiträge:
Zu deinem Code. Schau dir auch nochmal den Try..Finally-Block an. Wenn du zwei constructoren aufrufst, dann solltest du diese besser innerhalb des try aufrufen.
Delphi-Quellcode:
try
frReport := TfrReport.Create(NIL);
PDFExport := TPsfrPDFExport.Create(NIL);
finylly
PDFExport.Free;
frReport.Free;
end;
Hintergrund: Wenn einer der beiden constructoren fehlschlägt, wird in jedem Fall mit Free wieder richtig aufgeräumt, weil Free auf "nil" prüft, und somit auch keine
Exception wirft, wenn eine der beiden Instanzen nil ist.
und
Hintergrund: Wenn einer der beiden constructoren fehlschlägt, wird in jedem Fall mit Free wieder richtig aufgeräumt, weil Free auf "nil" prüft, und somit auch keine
Exception wirft, wenn eine der beiden Instanzen nil ist.
Die Absicht ist richtig (Konstruktor
vor dem try..finally-Block), die Begründung aber nicht
Wenn im Konstruktor eine
Exception auftritt
- Wird der Destruktor ausgeführt
- Und die
Exception anschließend weiter geworfen
- In den try..finally-Block kommt man somit erst gar nicht.
(Deshalb ist
Free()
sogar eigentlich unnötig da im try..finally-Block die Referenz niemals
nil
sein
kann, ein
Destroy()
reicht völlig)
Denn zum echten Schutz vor einem MemLeak müsste es so lauten
Delphi-Quellcode:
frReport := nil;
PDFExport := nil;
try
frReport := TfrReport.Create(NIL);
PDFExport := TPsfrPDFExport.Create(NIL);
finally
PDFExport.Free;
frReport.Free;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)