Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
9. Mär 2009
Naja, wenn man sich das alles richtig überlegt, dann kann man das so auch machen, man muss aber dann genau schauen welchen Speichern man reserviert und freigibt usw., da müsste man sich dann selbst drum kümmern.
Wenn man nicht ein Array in der Länge verändert, sondern direkt den Speicher manipuliert, dann berührt dies den Referenzzähler nicht. Denn die alten Referenzen werden nicht entfernt...
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
28. Feb 2009
Doch, eigentlich geht das so. Prüf am besten vorher und nachher den Inhalt einmal im Debugger.
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
28. Feb 2009
Die Leaks sind zwar unschön, aber schlecht sind vor allem die ersten beiden Fehler. Diese verursachen auch die Fehler. Diese zeigen, dass da Speicher tatsächlich überschrieben wird.
Jetzt müsste der Stacktrace mit den Adressen verglichen werden, dafür gibts auch die Möglichkeit eine Map Datei zu erzeugen. Ob FastMM da noch mehr Details kann, weiß ich nicht.
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
27. Feb 2009
Vom Download nicht, einbinden musst du es schon in die uses. :mrgreen:
Schau mal in die FastMM4Options.inc, da gibts nen paar Optionen. Bei Speicherlecks sollte eine Logdatei automatisch erstellt werden, wenn du das Programm im Debugger startest. Wenn das Log auch außerhalb von Delphi erstellt werden soll, gibts da glaube ich die Option RequireDebuggerPresentForLeakReport oder so.
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
26. Feb 2009
Um genauer zu schauen wo die Speicherlecks liegen solltest du dir einmal FastMM anschauen und die Überprüfung aktivieren.
Und dann gibts da noch madExcept oder EurekaLog, die zum Debuggen sehr gut sind.
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
26. Feb 2009
Naja, was heißt automatisch freigegeben, ich sehe kein SetLength(..., 0), und das müsste da eigentlich irgendwo stehen. Denn sonst gibts doch erstmal noch eine Referenz auf die Objekte und der Referenzzähler wird nach dem Freigeben der Liste nicht 0. Denn deren Freigabe zerstört zwar die Referenzen, aber das passiert ja nicht explizit.
Ich hab gerade mal in die Implementierung von TList...
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
26. Feb 2009
Was mir auffällt:procedure TMainList.Clear;
begin
FCount := 0;
case FReserveManagment of
rmExact, rmProgressive: begin
FReservedLength := 0;
end;
end;
end;
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
26. Feb 2009
Das sind meistens alles Symptome für Speicherprobleme. Leider tritt, wenn man den falschen Speicher überschreibt z.B., der Fehler oft am anderen Ende des Projekts auf und ist dort unerklärlich.
Und leider ist so etwas nicht unbedingt reproduzierbar.
Und leider können ganz andere Änderungen, die eigentlich nichts damit zu tun haben das Problem verdecken. Sei es eine zusätzliche Variable, ein...
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
26. Feb 2009
Alles wird erfolgreich abgearbeitet, erst nach dem eigentlichen FormDestroy tritt eine Zugriffsverletzung bei Adresse 0 auf.
Im Anhang liegt der entsprechende delphiinterne Report.
Forum: Object-Pascal / Delphi-Language
Delphi
by jaenicke,
23. Feb 2009
Was mir spontan dazu einfällt ohne genauer in den Quelltext geschaut zu haben ist die Eigenschaft OwnsObjects. Wenn du die Objekte selbst freigeben willst, etc., dann musst du die auf False setzen. Wenn die TObjectList bei einem Delete oder der Zerstörung der Liste diese selbst aus dem Speicher entfernen soll, dann muss das auf True stehen.