AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Liste mit TRects - Speicherleck?

Ein Thema von igel457 · begonnen am 17. Nov 2006 · letzter Beitrag vom 18. Nov 2006
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 21:35
Hallo, ich bin es mal wieder.

Ich habe eine Liste, in die man Rechtecke des Typs TRect einfügen kann (siehe unten).

Meine Frage ist nun, mache ich dies so richtig oder laufe ich womöglich Gefahr ein Speicherleck zu erzeugen?

Delphi-Quellcode:
procedure TRectList.Add(ARect: TRect);
var ar:PRect;
begin
  new(ar);
  ar^.Left := ARect.Left;
  ar^.Top := ARect.Top;
  ar^.Right := ARect.Right;
  ar^.Bottom := ARect.Bottom;
  inherited Add(ar);
end;

procedure TRectList.Clear;
var i:integer;
begin
  for I := 0 to Count - 1 do
  begin
    FreeMem(inherited Items[i]);
    Delete(i);
  end;
end;

function TRectList.GetItem(AIndex:integer):TRect;
begin
  result := PRect(inherited Items[AIndex])^;
end;

procedure TRectList.SetItem(AIndex:integer;AItem:TRect);
begin
  inherited Items[AIndex] := @AItem;
end;
Danke für eure Hilfe,
igel457
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von jakobwenzel
jakobwenzel

Registriert seit: 31. Aug 2005
Ort: Ingelheim am Rhein
141 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 21:39
Setz einfach mal Application.ReportMemLeaksOnShutdown auf True, und du weißt, ob du memleaks hast.
Jakob Wenzel
"My store now sells Ninja Weapons!"
Comicverkäufer bei den Simpsons
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 21:43
Hm...

ReportMemLeaksOnShutdown finde ich leider nicht. Muss ich da noch irgendwas einbinden?
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 21:47
Sollte das nicht ohne Application funktionieren?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 21:50
Du verwendest oft inherited. Z.B. hier :

  inherited Items[AIndex] := @AItem; Was ist z.B. das ? Von wo wird denn da was geerbt ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 21:52
Die Liste stammt von TList ab... habe ich vergessen zu sagen...
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 21:53
dein Clear müsste irgendwann ein "Index out of Bounds" bringen weil du die Schleife vorwärts laufen lässt aber die Elemente der reihe nach löschst. Somit werden es immer weniger Items pro Durschlauf und die letzten Schleifendurchläufe klappen nicht mehr.
Deine Methode SetItems macht überhaupt keinen Sinn, denn AItem liegt auf dem Stack und ist nach verlassen der Methode nicht mehr gültig. Somit hängst du einen Pointer in deine Liste welcher auf eine Variable auf dem Stack zeigt welche früh oder Später überschrieben wird.

und in der Add-Methode kannst du anstelle von
Delphi-Quellcode:
ar^.Left := ARect.Left;
ar^.Top := ARect.Top;
ar^.Right := ARect.Right;
ar^.Bottom := ARect.Bottom;
auch gleich schreiben
ar^ := ARect; gleiches kannst du auch in der Set-Methode machen, schließlich ist der Speicher schon durch Add reserviert wenn dem Index ein neuer Rect-Wert zugewiesen wird.
Genau da könnte auch dein Speicherleck sein. In der Add-Methode vorderst du mit "new" speicher an und hängst den Pointer auf diesen Speicher in die Liste. In der SetMethode überschreibst du diesen Pointer einfach ohne den alten Speicher frei zu geben. Aber wie gesagt macht es auch keinen Sinn den Pointer dort zu überschreiben. Sinvoller ist es das zu überschreiben wo der Pointer hin zeigt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 22:08
Danke für die Antworten, jetzt sieht das ganze so aus:

Delphi-Quellcode:
{TRectList}

procedure TRectList.Add(ARect: TRect);
var ar:PRect;
begin
  new(ar);
  ar^ := ARect;
  inherited Add(ar);
end;

procedure TRectList.Clear;
var i:integer;
begin
  while Count > 0 do
  begin
    FreeMem(inherited Items[i]);
    Delete(0);
  end;
end;

function TRectList.GetItem(AIndex:integer):TRect;
begin
  result := PRect(inherited Items[AIndex])^;
end;

procedure TRectList.SetItem(AIndex:integer;AItem:TRect);
var ar:PRect;
begin
  FreeMem(inherited Items[AIndex]);
  new(ar);
  ar^ := AItem;
  inherited Items[AIndex] := ar;
end;
Ist das so aktzeptabler?

Schonmal ein dickes Dankeschön.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 22:12
schau dir mal dein neues Clear an, dein "i" ist dort fehl am Platz.
Und in der SetMethode ist das freigeben überflüssig. Du gibst dort speicher frei und forderst sofort danach neuen Speicher an. Sinnvoller wäre es den einmal reservierten Speicher weiter zu nutzen.
PRect(inherited Items[AIndex])^ := AItem; und zu deinem Clear. Es geht auch so
Delphi-Quellcode:
var i: Integer;
begin
  for i := 0 to Count - 1 do
    Dispose(inherited Items[i]);
  inherited Clear();
Anstelle von Dispose kannst du natürlich auch weiter "FreeMem" nutzen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Liste mit TRects - Speicherleck?

  Alt 17. Nov 2006, 22:17
Danke für die Hinweise, das mit dem "i" ist mir schon aufgefallen...
Delphi-Quellcode:
{TRectList}

procedure TRectList.Add(ARect: TRect);
var ar:PRect;
begin
  new(ar);
  ar^ := ARect;
  inherited Add(ar);
end;

procedure TRectList.Clear;
begin
  while Count > 0 do
  begin
    FreeMem(inherited Items[0]);
    Delete(0);
  end;
end;

function TRectList.GetItem(AIndex:integer):TRect;
begin
  result := PRect(inherited Items[AIndex])^;
end;

procedure TRectList.SetItem(AIndex:integer;AItem:TRect);
begin
  PRect(inherited Items[AIndex])^ := AItem;
end;
Ich arbeite so selten mit Pointern und Co, da bin ich mir nie so richtig sicher...

@SirThornberry
Was ist an deiner Clear Methode besser? Damit wird die Liste doch sogar zweimal durchlaufen...

Danke,
igel457
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf