Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Freigeben -> AV; Bearbeiten -> Nichts weiter (https://www.delphipraxis.net/129669-freigeben-av%3B-bearbeiten-nichts-weiter.html)

jaenicke 27. Feb 2009 16:03

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Zitat:

Zitat von xZise
Also ich habe mir jetzt FastMM4 gedownloadet, aber wie erhalte ich genauere Angaben?

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.

xZise 27. Feb 2009 18:23

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Naja ich hatte es gedownloadet und entpackt und zu der Form sowie zum Projekt (an erster Stelle) "FastMM4" hinzugefügt. Aber weiter kam ich dann halt nicht.

MfG
xZise

xZise 28. Feb 2009 13:10

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ihr,

ich habe es nun hingekriegt die Fehlermeldung auszugeben. Das Ergebnis ist im Anhang. Eine Sache: Ich habe den Code etwas verändert.

In UHaupt:
Delphi-Quellcode:
procedure TFLiberate.FormCreate(Sender: TObject);
begin
  Datenbank := TDatenbank.Create(ExtractFilePath(ParamStr(0)) +  'db');
  ReportMemoryLeaksOnShutdown := true;

  Exemplarliste := TExemplareZeilenListe.Create;
  Kursliste := TKursZeilenListe.Create;

  Exemplarliste.LadeAusDatenbank(Datenbank);
end;
In UZeilen:
Delphi-Quellcode:
procedure TExemplareZeilenListe.LadeAusDatenbank(const ADatenbank : TDatenbank);
var
  Daten : TExemplarZeile;
  i : Integer;
  ILExemplarIDs, ILPersonenIDs, ILBuchIDs, ILBEIDs : TIntegerList;
  BLAusgedruckt : TBooleanList;
begin
  inherited;
  ILExemplarIDs := TIntegerList.Create;
  ILPersonenIDs := TIntegerList.Create;
  ILBuchIDs := TIntegerList.Create;
  ILBEIDs := TIntegerList.Create;
  BLAusgedruckt := TBooleanList.Create;
  try
    ADatenbank.GibExemplarIDs(ILExemplarIDs);
  finally
    ILExemplarIDs.Free;
    ILPersonenIDs.Free;
    ILBuchIDs.Free;
    ILBEIDs.Free;
    BLAusgedruckt.Free;
  end;
end;
Wenn ich den letzten Datenbank Aufruf auch noch entfernen würde, würde kein Fehler mehr kommen.

MfG
xZise

jaenicke 28. Feb 2009 13:43

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
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.

xZise 28. Feb 2009 14:59

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Hallo Sebastian,
ich vermute es liegt am ehesten an den "Move"-Befehlen. Ich werde mal gucken, in wie fern ich da was rausbekomme.

Okay, ich habe alle "Move"-Befehle manuell implementiert (in TMainList!) und es funktioniert. Wobei nur das "Move" in "MoveContent" aufgerufen wird:
Delphi-Quellcode:
procedure TMainList.MoveContent(const AFrom, ATo, ASize: Integer);
var
  i, ValueCount: Integer;
  ValueBuffer : TVarRecArray;
begin
  // Problemstelle !
  //Move(FValues[AFrom], FValues[ATo], ASize);
  //exit;
  ValueCount := ASize div SizeOf(TVarRec);
  SetLength(ValueBuffer, ValueCount);
  for i := 0 to ValueCount - 1 do
    ValueBuffer[i] := FValues[AFrom + i];

  for i := 0 to ValueCount - 1 do
    FValues[ATo + i] := ValueBuffer[i];
end;
So funktioniert es. Wenn ich aber die Kommentarezeichen entferne, bekomme ich Fehler.

Ich verwende "Move" auch im Add(TVarRecArray) sowie im Assign. Aber wie gesagt, das wird nicht aufgerufen in dieser Konstellation. Ich glaube ich werde das in eine extra "TXList"-Stressunit umbauen.

Aber ist den hier nicht "Move" möglich?

MfG
xZise

jaenicke 28. Feb 2009 18:35

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Doch, eigentlich geht das so. Prüf am besten vorher und nachher den Inhalt einmal im Debugger.

xZise 28. Feb 2009 21:48

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Eigentlich ist der Inhalt immer in Ordnung.

MfG
xZise

xZise 7. Mär 2009 14:55

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ich bins wieder,

ich habe jetzt hier eine "Stresstest"-Version.

Bei mir kann ich nur IntegerList verwenden ohne Fehlermeldungen.

MfG
xZise

Blup 9. Mär 2009 13:38

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Move sollte man in Verbindung mit Variablen deren Inhalt eine Referenzzählung erfordert nicht einsetzen.
Das betrifft insbesondere Daten die Strings oder Interface enthalten.

xZise 9. Mär 2009 16:48

Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
 
Also alternativ jeden einzelnen Wert kopieren? Oder gibt es eine "bessere" Alternative?

MfG
xZise


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.
Seite 3 von 4     123 4      

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