![]() |
Delphi: Pointer und Speicher
Hallo,
wie kann man ermitteltn, wieviel Speicherplatz noch auf dem Heap ist, bevor man einen neuen Pointer erstellt. Mit AllocMemSize kann man nur den bereits belegten Speicherplatz ermitteln (Dieser hat eine ganz andere Größe, als der, den der Windows Taskmanager ermittelt). Ich habe den Eindruck, dass durch die Pointer Speicherplatz verbraucht wird, so dass nach einer gewissen Laufzeit des Programms über das Menü keine Forms mehr aufgerufen werden könnnen ("Zugriffsverletzung bei Adresse 004431FC in Modul ... Lesen von Adresse 000000004"). Wer kann mir helfen? Peter |
Re: Delphi: Pointer und Speicher
Zitat:
Zitat:
|
Re: Delphi: Pointer und Speicher
Danke für die Antwort.
Ich habe jetzt festgestellt, dass der durch AllocMemSize angezeigte Speicher bei jedem Formularaufruf etwas größer wird. Die Formulare werden nur durch visible:= true/false ein- bzw. ausgeblendet. Die Pointerstruktur, die ich verwende funktionierte schon etliche Jahre lang unter DOS/Turbopascal. An dieser Struktur habe ich beim Übertragen zu Windows / Delphi nichts geändert. Das war auch mein erster Gedanke, dass hier etwas schief gelaufen sein könnte. Auch nach vielen Stunden und Tagen Lauf dieses Programms (es handelt sich um ein Messwerterfassungsprogramm) ändert sich der durch AllocMemSize angezeigte Wert nicht. Von daher suche ich den Fehler doch eher bei den Forms. Interessanterweise läuft dieses Programm auch noch auf einem Windows98-Rechner und dort offensichtlich ohne Probleme. Kann das eventuell an Delphi 4 liegen. Ich scheue mich auf eine neuere Version von Delphi zu wechseln, da ich relativ viel negatives darüber lese. Peter |
Re: Delphi: Pointer und Speicher
Delphi 5 oder 7 ist auch noch ziemlich gut :D - aber das ist Geschmackssache.
Nimm FastMM um zu überprüfen, ob irgendwo ein Leck ist. |
Re: Delphi: Pointer und Speicher
Der Taskmanager zeigt den gesamten dem Programm zugewiesenen Speicherpool an. Diesen verwaltet im Programm dann der Heap/Speichermanager. Wenn dieser nun nicht auf eine gewisse Art eine Logik in seiner Verwaltung reinbringt sondern einfach nur frei alloziiert und freigibt, dann kann sein Bedarf steigen (wenn er freigegebene Bereiche mit der angeforderten oder einer grösseren Grösse nicht wieder alloziiert bzw. zurückliefert). Dadurch sieht es im Taskmanager so aus, als wenn ständig der Speicherbedarf steigt, was aber nur an der Organisation des Speichermanagers liegt. Zum anderen wird auch ein jemals vom Speichermanager von Windows angeforderter Speicherpool nicht wieder zurück gegeben bzw. wieder verkleinert. Von daher wird es nicht wieder fallen im Taskmanager - es kann nur steigen.
Aber wenn es mit visible/hide zu einer Alloziierung kommt, ist die Frage ob nicht doch eine Instanz oder Pointer im OnShow alloziiert wird, welche nicht wieder ordentlich freigegeben wird. Aber da hilft dann u.a. FastMM... |
Re: Delphi: Pointer und Speicher
Hallo Dezipaitor, hallo Muetze1,
vielen Dank für Eure Antwort. Ich werde mich mal mit FastMM auseinandersetzen. Mir ist noch folgendes aufgefallen: In einer neu in das Programm eingebauten Routinenen zum Auslesen eines USB-Messwertloggers werden die Daten folgendermaßen abgerufen:
Delphi-Quellcode:
Ich weis nicht, ob in diesem Fall new(p) und dispose (p) irgendwo in der externen dll versteckt sind. Oder sind diese Prozeduren in diesem Fall nicht notwendig?
...
interface ... var ... DataBuffer: ARRAY[0..7] OF LongInt; ... implementation {$R *.DFM} PROCEDURE StartDevice; stdcall; external 'K8047d.dll'; PROCEDURE StopDevice; stdcall; external 'K8047d.dll'; PROCEDURE ReadData(Buffer:Pointer); stdcall; external 'K8047d.dll'; ... procedure TForm1.FormCreate(Sender: TObject); begin StartDevice; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin StopDevice; end; procedure auslesen(Sender: TObject); var p:pointer; i:integer; s:string; begin p:=@DataBuffer; ReadData(p); s:=''; for i:=0 to 5 do s:=s +inttostr(DataBuffer[i])+chr(9); .... end; Müßte p nicht als ^DataBuffer definiert sein (am besten global)? Und dann hinter StartDevice New(p) und hinter StopDevice Dispose(p) eingefügt werden? Ich werde mal in der Zwischenzeit diese Procedure ausklammern und gucken, was passiert. Peter |
Re: Delphi: Pointer und Speicher
Wenn p ein Zeiger auf den Puffer sein soll (den du ja mit @ zuweist), dann ist alles richtig. New und Dispose brauchst du nur, wenn du keine zugrunde liegende Variable wie deinen Databuffer hast.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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