![]() |
IdTCPServer + MemoryLeak
Hallöchen,
Ich hab wieder mal ein Problemchen, unzwar schau ich mir gerade die Indy Components für TCP verbindungen an und musste feststellen, dass es scheinbar ein paar Probleme damit gibt. (Indy 10 von Turbo Delphi)
Delphi-Quellcode:
Das ist der Code und ich bekomme folgende Message:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, IdTCPServer, IdComponent, IdContext; type TMain = class(TForm) RichEdit1: TRichEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } procedure OnConnect(AContext: TIdContext); public { Public-Deklarationen } Server: TIdTCPServer; procedure Log(Text: String; Farbe: Byte = 0); end; var Main: TMain; implementation {$R *.dfm} { TForm1 } procedure TMain.FormCreate(Sender: TObject); begin ReportMemoryLeaksOnShutdown := True; Server := TIdTCPServer.Create(self); Server.DefaultPort := 1307; Server.OnConnect := OnConnect; end; procedure TMain.FormDestroy(Sender: TObject); begin if (Server.Active) then Server.Active := False; Server.Free; end; procedure TMain.Log(Text: String; Farbe: Byte = 0); var aFont: TFont; begin aFont := TFont.Create; aFont.Name := 'Courier'; aFont.Size := 10; case Farbe of 0: aFont.color := clSilver; 1: aFont.Color := clWhite; 2: aFont.Color := clRed; 3: aFont.color := clYellow; 4: aFont.color := clLime; 5: aFont.color := clAqua; end; RichEdit1.SelAttributes.Assign(aFont); RichEdit1.Lines.add(Format('[%s]: %s',[TimeToStr(now),Text])); aFont.Free; end; procedure TMain.OnConnect(AContext: TIdContext); begin with aContext.Binding do begin Log('Incoming connection from '+PeerIP); Log('Checking IP...'); Log('Connection Accepted from '+PeerIP); end; end; end. Zitat:
//Edit Achja, es verbindet übrigends niemand, ich schließe das Programm ja gleich wieder. Und ja, ich weiß, dass ich keine Prüfung der IP programmiert hab ;) CROSSPOST: ![]() |
Re: IdTCPServer + MemoryLeak
Das ist bekannt, von den Indy-Entwicklern so gewollt und in neueren Delphi-Versionen behoben worden, indem die Leaks registriert werden.
Kein Grund zur Sorge, die Leaks sind zwar unschön, da beim Programmende (im Debugger) ein Dialog angezeigt wird. Der Speicher wird ja sowieso vom Betriebssystem freigegeben sobald das Programm beendet wird. |
Re: IdTCPServer + MemoryLeak
Hab mir schon die neueste Indy gezogen (10.0.53 oder so) und die Pas reingeschmissen, damit der das (hoffentlich) neu compiliert.
Trotzdem ändert das nichts an dem Leak. Ich würde den trotzdem gerne weghaben wollen, da ich sonst immer wieder drauf Stoße und wenn ich noch selbst wo leaks einbaue, muss ich erstmal schauen wo die sind. |
Re: IdTCPServer + MemoryLeak
Es sind immer die selben Leaks von Indy, da fallen deine eigenen schon auf.
Das Problem liegt daran, dass du wahrscheinlich :glaskugel: FastMM benutzt. Dieses besitzt zwar eine Funktion um bekannte leaks zu registrieren, aber da die Objekte welche die Leaks verursachen in Indy im Implementation-Abschnitt deklariert sind, hast du darauf keinen Zugriff. Indy registriert die Leaks zwar für den neuen MemoryManager von Delphi, aber soweit ich weiss nicht für FastMM. Du könntest natürlich den Indy-Source etwas frisieren, dann musst du aber bei zukünftigen Updates die Änderungen nachführen. |
Re: IdTCPServer + MemoryLeak
//Edit
Okay den Integer hab ich geschafft wegzubekommen aber es ist nur einmal TIdCriticalSection drin mal gucken ob ich den auch noch raus bekomme.... Okay nun sind beide raus. Einmal im IdThread
Delphi-Quellcode:
Das war ausgeklammert, wie dort beschrieben.
// This call hangs if not all threads have been properly destroyed.
// But without this, bad threads can often have worse results. Catch 22. TIdThread.WaitAllThreadsTerminated; FreeAndNil(GThreadCount); Und einmal im IdComponent:
Delphi-Quellcode:
Da hab ich einfach das FreeAndNil(GStackCriticalSection); angefügt.
destructor TIdComponent.Destroy;
begin inherited; // After inherited - do at last possible moment GStackCriticalSection.Acquire; try Dec(GInstanceCount); if GInstanceCount = 0 then begin // This CS will guarantee that during the FreeAndNil nobody will try to use // or construct GStack FreeAndNil(GStack); end; finally GStackCriticalSection.Release; FreeAndNil(GStackCriticalSection); end; Keine Ahnung ob das okay ist was ich da mache, aber es entstehen keine Memleaks mehr. Wenn einer gute gründe hat warum man das nicht machen sollte, immer her damit. |
Re: IdTCPServer + MemoryLeak
Hallo,
mal etwas im Nachtrag zum Thread: Zitat:
Zitat:
Zitat:
Die Leaks haben ihre Berechtigung. Für berechtigte Ausnahmen gibt es FREE_ON_FINAL. Gruß, Assertor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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