Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MemoryLeak in Nexus? (https://www.delphipraxis.net/191760-memoryleak-nexus.html)

haentschman 16. Feb 2017 17:24

Datenbank: Nexus • Version: 4 • Zugriff über: Nexus

MemoryLeak in Nexus?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallöle...:P
Ich hab mal was merkwürdiges hier...:

Beispielkonstrukt:
Delphi-Quellcode:
function DataModule.CreateData: TDataSet;
begin
  Result := TNxQuery.Create(nil);
  Result.SQL.Text := 'Blubb';
  Result.Open;
end;
...
procedure Anwendung.ReadData;
var
  I: Integer;
  Data: TDataSet;
begin
  Data := DataModule.CreateData;
  try
    while not Data.Eof do
    begin
      ...Lesen
    end;
  finally
    Data.Free;
  end;
end;
Ich habe bei allen diesen Konstrukten ein Speicherleck. :gruebel: Habe ich was übersehen? Die Zeile 321 enthällt den Aufruf zu DataModule.CreateData
Oder veräppelt mich der MadExcept? :gruebel:

Danke.

Uwe Raabe 17. Feb 2017 08:16

AW: MemoryLeak in Nexus?
 
Ist TNexusQuery von dir? Das Original heißt meines Wissens TNxQuery.

haentschman 17. Feb 2017 08:35

AW: MemoryLeak in Nexus?
 
Moin Uwe...:P
Zitat:

Das Original heißt meines Wissens TNxQuery.
...richtig. Die verwende ich auch. :zwinker: Für das Beispiel fand ich das ausreichend. :wink:

Nachtrag: Änderung TNxQuery im Beispielkonstrukt.

mm1256 17. Feb 2017 08:57

AW: MemoryLeak in Nexus?
 
Hallo,

ist das Beispiel vollständig? Ich frag nur, weil du den Constructor der TnxQuery aufrufst, aber freigeben tust du ein TDataSet.

BTW ich verwende die NexusDB schon seit Version 1.14 aber Probleme mit MemoryLeaks hatte ich noch nicht. Thorsten macht hier wirklich einen sehr guten Job :thumb:

haentschman 17. Feb 2017 09:18

AW: MemoryLeak in Nexus?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...:wink:
Zitat:

weil du den Constructor der TnxQuery aufrufst, aber freigeben tust du ein TDataSet.
...TnxQuery stammt von der Hierachie des TDataSet ab. Siehe auch Screenshot: Data.DB ... TDataSet.Open Der Pointer auf die Instanz ist die gleiche. Also ist das Freigeben auch so richtig...:zwinker:

Nachtrag:
Ich denke hier veräppelt mich der MadExcept. :roll: Ein Beenden mit ReportMemoryLeaksOnShutdown := True bringt kein Leak bis auf den UnicodeString den ich testweise eingefügt habe.

mm1256 17. Feb 2017 09:32

AW: MemoryLeak in Nexus?
 
Sehe ich ganz anders. Du erzeugst eine Instanz der TnxQuery, deren Teilmenge von der Objekthierarchie ein TDataSet ist. Das ist richtig, darum funktioniert das auch. Aber bei der Freigabe wird lediglich der Destructor des TDataSet aufgerufen, und NICHT der Destructor der TnxQuery. Das muss leaken, was sonst. Die Speicheradresse ist die selbe, aber...deine Frage war ja "Habe ich was übersehen?".

FaTaLGuiLLoTiNe 17. Feb 2017 09:38

AW: MemoryLeak in Nexus?
 
Das dürfte eigentlich kein Problem sein, da der Destruktor immer virtuell ist.

samso 17. Feb 2017 09:43

AW: MemoryLeak in Nexus?
 
Zitat:

Zitat von mm1256 (Beitrag 1361920)
Aber bei der Freigabe wird lediglich der Destructor des TDataSet aufgerufen, und NICHT der Destructor der TnxQuery.

Das kann ich aber nur glauben, wenn bei dem Destructor von TnxQuery das override vergessen worden wäre. Ansonsten sorgt die Vererbung für den korrekten Aufruf des richtigen Destructors.

haentschman 17. Feb 2017 09:45

AW: MemoryLeak in Nexus?
 
Danke an Alle...:wink:
Zitat:

Das dürfte eigentlich kein Problem sein, da der Destruktor immer virtuell ist.
Zitat:

Ansonsten sorgt die Vererbung für den korrekten Aufruf des richtigen Destructors.
...sehe ich auch so.

Rollo62 17. Feb 2017 09:46

AW: MemoryLeak in Nexus?
 
https://www.nexusdb.com/Support/index.php?q=id_1871.htm

Wenn das virtuelle Destroy (override) richtig aufräumt sollte es doch OK sein.

Rollo


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz