AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

Ein Thema von s.h.a.r.k · begonnen am 8. Mai 2011 · letzter Beitrag vom 9. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 18:58
Delphi-Version: XE
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 Hier mal ein wenig Code:
Delphi-Quellcode:
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.
Kann mir jemand erklären, warum Delphi nicht erkennt, dass hier was selbstständig aufgeräumt werden muss?

Dieser Code (leicht gekürzt) hingegen funktioniert ohne Probleme und liefert keinerlei Speicherleak:
Delphi-Quellcode:
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.
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?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 19:20
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 19:26
http://qc.embarcadero.com/wc/qcmain.aspx?d=44634

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.
$2B or not $2B

Geändert von himitsu ( 8. Mai 2011 um 19:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 19:33
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 19:57
Ah, das wars. Gemanagte Datentypen in einem Record und der als Funktionsergebnis.
Eigentlich passiert es überall, aber bei ungemanagten Typen fällt es nicht auf.
$2B or not $2B
  Mit Zitat antworten Zitat
USchuster

Registriert seit: 12. Sep 2010
Ort: L.E.
120 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 20:09
Ah, das wars.
Nein, denn QC 44634 wurde in XE offenbar durch den Fix für QC 77903 behoben und in einigen Tagen wird QC den Status sicher entsprechend anzeigen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 20:12
Nja, auch nur bedingt besser ... also daß man sich Bugfixes immer kaufen muß.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 20:46
Ah, das wars.
Nein, denn QC 44634 wurde in XE offenbar durch den Fix für QC 77903 behoben und in einigen Tagen wird QC den Status sicher entsprechend anzeigen.
Tja, kann ich nur sagen, dann haben sie es nicht richtig gefixt.

Boom:
Delphi-Quellcode:
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.
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
USchuster

Registriert seit: 12. Sep 2010
Ort: L.E.
120 Beiträge
 
Delphi XE3 Professional
 
#9

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 21:30
Ah, das wars.
Nein, denn QC 44634 wurde in XE offenbar durch den Fix für QC 77903 behoben und in einigen Tagen wird QC den Status sicher entsprechend anzeigen.
Tja, kann ich nur sagen, dann haben sie es nicht richtig gefixt.
"Es" kann auch nicht gefixed werden, sondern nur konkrete Probleme in Form von Testfällen mit vollständigem Quellcode. QC 44634 ist gefixed, jedoch QC 75036 ist es nicht. Letzteres entspricht wohl dem Problem hier inkl. Deinem Beispiel. Wenn TRecord1 in einer Variable gespeichert wird

Delphi-Quellcode:
var
  R: TRecord1;
begin
  ReportMemoryLeaksOnShutdown := True;
  R := Get;
  R.Foo;
end.
, wie in QC 75036 oder Armins gekürztem Beispiel, dann gibt es kein Memoryleak. Damit Embarcadero es "diesmal" "richtiger" macht, schicke ich denen Armins gekürztes Beispiel in der kapputten Fassung.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Seltsames Speicherleak-Problem mit Records in Verbindung mit Arrays

  Alt 8. Mai 2011, 22:19
"Es" kann auch nicht gefixed werden, sondern nur konkrete Probleme in Form von Testfällen mit vollständigem Quellcode.
Wenn man die Bugfixes nicht jedes Jahr wieder mit teuerem Geld bezahlen müsste, wäre die Bereitschaft, selber mehr Zeit in Fehlerdiagnosen zu stecken, sicher größer.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 Uhr.
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