Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Speicherlecks Bug in D6 oder FastMM4? (https://www.delphipraxis.net/139617-speicherlecks-bug-d6-oder-fastmm4.html)

RaSoWa1 1. Sep 2009 16:45


Speicherlecks Bug in D6 oder FastMM4?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

wegen eines Speicherproblems in einem Programm habe ich, das hier im Forum oft empfohlene FastMM4, installiert.

Ich bin dabei auf folgendes gestoßen:
FastMM4 meldet Speicherlecks (Meldung im Anhang) bei einem Prog (Code siehe unten), das nur aus einem Formular besteht!

Ist das ein Bug von D6 oder FastMM4?
Oder mache ich was falsch?

Gruß
Klaus

Projekt1:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.


program Project1;

uses
  FastMM4 in '..\Lib\FastMM\FastMM4.pas',
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Bernhard Geyer 1. Sep 2009 17:17

Re: Speicherlecks Bug in D6 oder FastMM4?
 
AFAIK habe ich in der HelpIntfs.pas was gefixt. Frag mich morgen nochmal damit ich dir den DIFF senden kann.

RaSoWa1 1. Sep 2009 17:50

Re: Speicherlecks Bug in D6 oder FastMM4?
 
Um detailierte Informationen von FastMm4 zu bekommen, muß ich die Delphi 6 Runtime Library Update 2 installieren. Ich habe es mir gerade heruntergeladen, aber noch nicht installiert.

Würde damit das Bug beseitigt?

RaSoWa1 3. Sep 2009 09:57

Re: Speicherlecks Bug in D6 oder FastMM4?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe jetzt das Update 2 und 3 für meine D6-Version installiert, aber das Problem ist damit nicht beseitigt.

Muß oder kann man damit leben?

Als Anhang das ausfürliche Protokoll von FastMM4. Leider kann ich mit den ganzen Speicheradressen nichts anfangen. Auf solche Tiefen der Programmierung bin ich nocht nicht vorgestoßen.

@Bernhard Geyer
Zitat:

AFAIK habe ich in der HelpIntfs.pas was gefixt. Frag mich morgen nochmal damit ich dir den DIFF senden kann.
Es wäre nett, wenn du mir was über den BUG mitteilen könntest.

Danke im Vorraus.
Gruß
Klaus

Bernhard Geyer 3. Sep 2009 10:04

Re: Speicherlecks Bug in D6 oder FastMM4?
 
Neue Prozedur:
Delphi-Quellcode:
procedure EnsureHelpManager;
begin
  if HelpManager = nil then
    HelpManager := THelpManager.Create;
end;
In Funktion RegisterViewer/GetHelpSystem den Aufruf von
Delphi-Quellcode:
if not Assigned(HelpManager) then
  ...
durch
Delphi-Quellcode:
    EnsureHelpManager;
ersetzen

In Methode THelpViewerNode.Create und THelpManager.AssignHelpSelector den Aufruf von _AddRef löschen

und in THelpManager.Release die Schleifen
Delphi-Quellcode:
for i := 0 to ...
auf
Delphi-Quellcode:
  .Count - 1 downto 0
umstellen.

Neuere Delphi-Versionen sind entsprechend gefixt.

RaSoWa1 6. Sep 2009 14:57

Re: Speicherlecks Bug in D6 oder FastMM4?
 
Hallo,

Dank der Hilfe von Bernhard Geyer, Google und vielen Tests habe ich das Problem gelöst.
Letztendlich haben nur 2 kleine Änderungen zum Erfolg geführt. FastMM4 meldet nun keine Lecks mehr.

Für alle die es interessiert:
1. unit HelpIntfs
Delphi-Quellcode:
function GetHelpSystem(out System : IHelpSystem) : Integer;
begin
  if not Assigned(HelpManager) then
  begin
    HelpManager := THelpManager.Create;
//    HelpManager._AddRef;       // diese Zeile entfernen
  end;

  System := HelpManager as IHelpSystem;
  Result := 0;
end;
2. unit WinHelpViewer
Delphi-Quellcode:
finalization
  if Assigned(HelpViewer.FHelpManager) then
  begin
    HelpViewer.InternalShutDown;
  end;
  if Assigned(WinHelpTester) then
  begin
    WinHelpTester := nil;
  end;
  HelpViewer.FreeInstance;     // diese zeile einfügen
  HelpViewer := nil;           // diese zeile einfügen
end.
Gruß
Klaus

himitsu 6. Sep 2009 15:13

Re: Speicherlecks Bug in D6 oder FastMM4?
 
heißt das THelpManager stellt ein Interface dar und die Variable HelpManager ist als Objekt (THelpManager) definiert?

und wenn du schon HelpManager._AddRef nutzt, dann solltest du diese Referenz auch irgendwann wieder reigeben (HelpManager._Release;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 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