![]() |
AW: Memory Leaks beheben
Hi,
mir ist nur ein Memoryleak in Andorra 2D bekannt, und das tritt unter Umständen beim Reinitialisieren von Andorra 2D auf (also TAdDraw.Finalize und Initialze in einer Kette). Die von deinem Leak-Checker angezeigten Zeilen deuten aber eher darauf hin, dass du einfach manche Objekte nicht richtig frei gibst - um genau zu sein deine Imagelist, da diese natürlich eine Reihe von TAdImages lädt und die TAdImages wiederum in den aufgelisteten Operationen Speicher reservieren. Die TAdImagelist würde dann auch die Images wieder frei geben und diese den von sich reservierten Speicher. Hoffe das hilft, Andreas |
AW: Memory Leaks beheben
Neben den schon erwähnten FastMM4 und MemCheck o.ä. solltest Du dir angewöhnen, das, was Du allokierst auch im gleichen Kontext freizugeben.
Beispiel:
Delphi-Quellcode:
Var
localObject : TSomeOBject; Begin localObject := TSomeObject.Create; Try DoSomethingWith(localObject); Finally localObject.Free End End; ... Type TSomeObject = Class (TSomeOtherObject) private fObject : TFoobar; ... Constructor TSomeObject.Create; begin inherited; fObject := TFoobar; end; Destructor TSomeObject.Destroy; Begin fObject.Free; inherited End; |
AW: Memory Leaks beheben
Danke für all Eure Tips, die haben mir schonmal weiter geholfen.
@igel457 Du hast Recht, die Imagelist wurde nicht freigegeben. VOn Andorra2d aus treten jetzt keine Memory Leaks mehr auf. Ich konnte den Leak auf folgende Prozedur zurückführen:
Delphi-Quellcode:
Allerdings verstehe ich nicht genau wieso hier ein Memory Leak auftritt.
function Textwerkzeug.wortAn( pText: string; wortNummer: integer ): string;
var lText: string; begin if copy( pText, length( pText ) - 1, 2 ) = CRLF then pText := copy( pText, 1, length( pText ) - 2 ); //LEAK lText := pText; while ( ansiPos( zTrennung, lText ) > 0 ) and ( wortNummer > 1 ) do begin delete( lText, 1, ansiPos( zTrennung, lText ) + length( zTrennung ) - 1 ); dec( wortNummer ); end; if wortNummer = 1 then if ansiPos( zTrennung, lText ) > 0 then result := copy( lText, 1, ansiPos( zTrennung, lText ) - 1 ) //LEAK else result := lText else result := ''; end; Das (pText/result über den copy Befehl) sind doch strings und keine Objekte? Wie soll man die denn freigeben/löschen? |
AW: Memory Leaks beheben
Delphi-Quellcode:
riecht ein wenig danach, als ob du den irgendwo als PChar o.ä. definiert hast und damit dann die Procedure aufrufst.
pText
Musst du das veränderte pText zwingend wieder zurückgeben? Wenn nicht, dann kannst du das auch so machen:
Delphi-Quellcode:
Eigentlich sollte man es vermeiden, die Parameter zu verändern es sei denn, die sollen auch bewusst wieder zurückgeliefert werden. (wortNummer)
function Textwerkzeug.wortAn( const pText: string; wortNummer: integer ): string;
var lText: string; begin if copy( pText, length( pText ) - 1, 2 ) = CRLF then lText := copy( pText, 1, length( pText ) - 2 ) else lText := pText; while ( ansiPos( zTrennung, lText ) > 0 ) and ( wortNummer > 1 ) do begin delete( lText, 1, ansiPos( zTrennung, lText ) + length( zTrennung ) - 1 ); dec( wortNummer ); end; if wortNummer = 1 then if ansiPos( zTrennung, lText ) > 0 then result := copy( lText, 1, ansiPos( zTrennung, lText ) - 1 ) //LEAK else result := lText else result := ''; end; Dann sollte man vor die Parameter aber auch ein
Delphi-Quellcode:
setzen.
var
Beim Benutzen der Func/Proc ist es einem dann auch bewusst, dass der Übergabeparameter nachher verändert sein kann. |
AW: Memory Leaks beheben
Könnte auch Parameter heißen.
(nja, dieses Typen-Prefix, welches du meins, ist eh eine Unsitte) Was soll das ![]() |
AW: Memory Leaks beheben
Darum ja auch nur "es riecht danach" ;)
|
AW: Memory Leaks beheben
Liste der Anhänge anzeigen (Anzahl: 1)
Also die Unit die ich da benutze, habe ich nicht selbst geschrieben.
Es ist Textwerkzeugunit die ich im Internet gefunden habe. (Ist im Anhang) Aufgerufen wird das ganze in dieser Prozedur:
Delphi-Quellcode:
procedure Verbindung.ClientSocketRead( Sender: TObject; Socket: TCustomWinSocket );
var lNachricht, lEineNachricht: Zeichenkette; begin lNachricht := Socket.receiveText; hatTextwerkzeug.setzeTrennung( NTrenner ); repeat lEineNachricht := hatTextwerkzeug.wortAn( lNachricht, 1 ); //LEAK if hatTextwerkzeug.laenge( lEineNachricht ) = hatTextwerkzeug.laenge( lNachricht ) then lNachricht := '' else lNachricht := hatTextwerkzeug.textOhne( lNachricht, 1, hatTextwerkzeug.laenge( lEineNachricht ) + hatTextwerkzeug.laenge( NTrenner ) ); if lEineNachricht <> '' then hatListe.haengeAn( ZeichenketteObjekt.init( lEineNachricht ) ); if zMitProtokoll then hatClientKontrollfenster.memo1.lines.add( 'Verbindung liest ' + lEineNachricht ); until lNachricht = ''; end; |
AW: Memory Leaks beheben
Wo wird
Delphi-Quellcode:
initialisiert und wieder freigegeben?
hatTextwerkzeug
Wie ist
Delphi-Quellcode:
definiert?
Zeichenkette
|
AW: Memory Leaks beheben
Liste der Anhänge anzeigen (Anzahl: 1)
hatTextwerkzeug wird in
Delphi-Quellcode:
initialisiert.
constructor Verbindung.init( pIPAdresse: Zeichenkette; pPortNr: GanzeZahl;
pMitProtokollieren: Wahrheitswert ); begin hatTextwerkzeug := Textwerkzeug.init; .. end;
Delphi-Quellcode:
Zeichenkette ist ein string
ZeichenketteObjekt = class
private zInhalt: Zeichenkette; public constructor init( pInhalt: Zeichenkette ); procedure setzeInhalt( pInhalt: Zeichenkette ); function Inhalt: Zeichenkette; destructor gibFrei; end; constructor ZeichenketteObjekt.init( pInhalt: Zeichenkette ); begin zInhalt := pInhalt; end; procedure ZeichenketteObjekt.setzeInhalt( pInhalt: Zeichenkette ); begin zInhalt := pInhalt; end; function ZeichenketteObjekt.Inhalt: Zeichenkette; begin result := zInhalt; end; destructor ZeichenketteObjekt.gibFrei; begin end; |
AW: Memory Leaks beheben
Das ist ja gruselig. Zum Einen heißt der vorgegebene Destruktor nicht GibFrei, sondern Destroy und sollte überschrieben werden. Zum Anderen: wenn schon eine Klasse, dann auch bitte mit Properties und entsprechenden Getter- und Setter-Methoden. Mir scheint, da hat sich jemand diese komische mSum-Unit genau angeschaut und abgekupfert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz