![]() |
Delphi-Version: XE
Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Nachdem wir gerade eh schon so viele schöne Record-Threads am laufen haben, habe ich mir gedacht, ich programmiere einfach mal eine Anwendung, welches sich mit Speicherleaks beschäftigt, die bei der Benutzung von Records auftreten :stupid: Hier mal ein wenig Code:
Delphi-Quellcode:
Kann mir jemand erklären, warum Delphi nicht erkennt, dass hier was selbstständig aufgeräumt werden muss?
type
TDynIntArray = array of Integer; TStatIntArray = array[0..1] of Integer; var Tmp : TStatIntArray; //Tmp : TDynIntArray; //Tmp : TArray<Integer>; begin ReportMemoryLeaksOnShutdown := True; try // Set up a array with two elements //SetLength(Tmp, 2); // <- Für dyn. Arrays entkommentieren! Tmp[0] := 10; Tmp[1] := 3; // Diese Zeile liefert kein Speicherleak //TValue.From<Integer>(6).ToString(); // Egal welcher dieser Zeilen aktiviert wird -> Speicherleak. // Darunter findet sich eine Beispielmeldung von FastMM4. Writeln( TValue.From<TStatIntArray>(Tmp).ToString() ); //Writeln( TValue.From<TDynIntArray>(Tmp).ToString() ); //Writeln( TValue.From<TArray<Integer>>(Tmp).ToString() ); (* --------------------------- Project1.exe: Memory Leak Detected --------------------------- This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer): 5 - 12 bytes: Unknown x 1 13 - 20 bytes: Unknown x 1 21 - 36 bytes: TValueDataImpl x 1 *) except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. Dieser Code (leicht gekürzt) hingegen funktioniert ohne Probleme und liefert keinerlei Speicherleak:
Delphi-Quellcode:
Daher gehe ich mal davon aus, dass Delphi Probleme mit der Verwaltung der Anzahl der Zeiger, die auf den entsprechenden Record verweisen, hat. Oder warum gibt das sonst Probleme?
type
TStatIntArray = array[0..1] of Integer; var Tmp : TStatIntArray; begin { ... } Tmp[0] := 10; Tmp[1] := 3; v := TValue.From<TStatIntArray>(Tmp); Writeln(v.ToString()); { ... } end. |
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Bekanntes Problem (bin gerade zu faul, den QC Eintrag herauszusuchen).
Problem ist an der Stelle, dass mit dem Rückgabeergebnis einer Funktion direkt weitergearbeitet wird. |
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
![]() und da wundert man sich, warum ich kaum noch was dort reporte ... ändert sich ja eh nix Sobald man aber den Record etwas verrößert (neue Felder einfügt), behebt sich das Problem oftmals von selber. |
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Ah, das wars. Gemanagte Datentypen in einem Record und der als Funktionsergebnis.
Ergebnis der Funktion in einer Variable speichern und damit weitermachen behebt das Problem. |
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Zitat:
|
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
|
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Nja, auch nur bedingt besser ... also daß man sich Bugfixes immer kaufen muß.
|
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Zitat:
Boom:
Delphi-Quellcode:
Genau das passiert nämlich im Fall von TValue. Dort gibts intern das Feld FData vom Typ TValueData, worin wiederum eine Interface Referenz (IValueData) gespeichert wird. Daher auch der Memleak des TValueDataImpl Objektes.
program Project1;
{$APPTYPE CONSOLE} type TRecord2 = record FIntf: IInterface; end; TRecord1 = record FRecord2: TRecord2; function Foo: string; end; function Get: TRecord1; begin Result.FRecord2.FIntf := TInterfacedObject.Create; end; function TRecord1.Foo: string; begin Result := ''; end; begin ReportMemoryLeaksOnShutdown := True; Get.Foo; end. |
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Zitat:
![]() ![]()
Delphi-Quellcode:
, wie in
var
R: TRecord1; begin ReportMemoryLeaksOnShutdown := True; R := Get; R.Foo; end. ![]() |
AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 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