Autor Beitrag
O'rallY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Fr 30.07.04 14:14 
In meinem Programm benutze ich eine Liste (verkettete records) um Koordinaten zu speichern. Dabei wird jedesmal wenn ein Element angefügt wird Speicher alloziert und beim löschen wieder freigegeben, sollte er auf jedenfall.

Denn wenn ich das Programm zur Laufzeit im TaskManager betrachte steigt die Speicherauslastung zwar stetig an, jedoch freigegeben wird dort nichts.

Hier mal ein Codeauszug:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
{...} 
PItem = ^TItem; 
  TItem = packed record 
    Data: TFloatingPoint; 
    Next: PItem; 
  end; 

procedure TGestureList.Add(APoint: TFloatingPoint; pos: integer = -1); 
var 
  cur_item, new_item: PItem; 
begin 
  GetMem(new_item, SizeOf(TItem)); 

  new_item^.Data := APoint; 

  if pos = -1 then 
    pos := ItemCount; 

  if pos = 0 then begin 
    cur_item := StartItem; 
    new_item^.next := cur_item; 
    StartItem := new_item; 
    Inc(ItemCount); 
  end 
  else 
    if pos <= ItemCount then begin 
      cur_item := GetItem(pos-1); 
      new_item^.next := cur_item^.next; 
      cur_item^.next := new_item; 
      Inc(ItemCount); 
    end else FreeMem(new_item, SizeOf(TItem)); 
end; 

procedure TGestureList.Delete(Pos: integer); 
var 
  del_item, cur_item: PItem; 
begin     
  if StartItem <> nil then     
    if pos = 0 then begin     
      del_item := StartItem;     
      StartItem := StartItem^.Next; 
      FreeMem(del_item, SizeOf(TItem)); 
      Dec(ItemCount); 
    end else 
      if pos < ItemCount then begin     
        cur_item := GetItem(pos-1); 
        del_item := cur_item^.Next; 
        cur_item^.Next := del_item^.Next; 
        FreeMem(del_item, SizeOf(TItem)); 
        Dec(ItemCount);     
      end; 
end; 

procedure TGestureList.DelAllFromItem(var Item: PItem); 
begin 
  if Item <> nil then begin 
    if Item^.Next <> nil then DelAllFromItem(Item^.Next); //Rekursion! 
    FreeMem(Item, SizeOf(TItem)); 
    Item := nil; 
  end; 
end; 
{...}


Woran liegt das? :?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...


Zuletzt bearbeitet von O'rallY am Sa 31.07.04 12:04, insgesamt 1-mal bearbeitet
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 30.07.04 17:02 
Hallo

kleine gegenfrage: warum nutzt du keine TList oder Tobjectlist?

edit: was für mich ein wenig komisch aussieht, ist das du new/dispose und getmem/freemem mischst.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 481

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 30.07.04 17:40 
Ich hab mir den Quellcode nicht angesehen, aber so ein Verhalten liegt AFAIK daran, dass Windows den vom Programm freigegebenen Speicher erstmal weiter für dein Programm reserviert, und aus diesem Bereich neue Speicheranforderungen deines Programms erfüllt.
Probier mal zwei Varianten:
Zuerst mal 1000de (ich weiss nicht, wie groß deine Objekte sind) Objekte einfuegen und dann alle auf einmal entfernen und zweitens
1000mal hintereinander 1 Objekt erstellen und wieder löschen.

Dann müßte sich ja ein Unterschied ergeben...klar, was ich meine?

_________________
We are, we were and will not be.
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Sa 31.07.04 12:03 
Keldorn hat folgendes geschrieben:

kleine gegenfrage: warum nutzt du keine TList oder Tobjectlist?

Da ich bei meinem Programm anstrebe, es möglichst klein zu halten. Und die Classes-Unit/Contnrs-Unit einzubinden vergrößert es doch ziemlich. Wenn ich es selber schreibe, habe ich zum einen mehr Kontrolle und zum zweiten habe ich wirklich nur relevanten und nicht unnötigen Code.
Keldorn hat folgendes geschrieben:

edit: was für mich ein wenig komisch aussieht, ist das du new/dispose und getmem/freemem mischst.

Ups. Das war keine Absicht. Da hab ich wohl vergessen, dass auch zu ändern :).

Gausi hat folgendes geschrieben:

Zuerst mal 1000de (ich weiss nicht, wie groß deine Objekte sind) Objekte einfuegen und dann alle auf einmal entfernen und zweitens
1000mal hintereinander 1 Objekt erstellen und wieder löschen.

Beide Varianten zogen das gleiche Ergebnis mit sich: Die Speicherauslastung stieg immer weiter an, ohne zurück zu gehen. :(

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
O'rallY Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: Sa 31.07.04 13:03 
Mir ist was aufgefallen. Wenn ich meine Liste in einer Schleife benutze, egal welche Variante ich benutze, wird der Speicher Ordungsgemäß wieder freigegeben. Im Programm selber aber nicht, obwohl ebenfalls die Löschroutinen aufgerufen werden.

Im Programm ist es so, dass ein Maushook die Mausbewegungen abfängt und die Koordinaten in dieser Liste speichert. Wird die Maustaste losgelassen wird sofort die Löschroutine aufgerufen. Was mir noch auffiel war, dass die Speicherbelastung bei der Maus höher war, als wenn ich mittels Schleife eine größere Anzahl an Items speicher lies :?

_________________
.oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...