AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi: Pointer und Speicher

Offene Frage von "peter21"
Ein Thema von peter21 · begonnen am 5. Okt 2007 · letzter Beitrag vom 7. Okt 2007
Antwort Antwort
peter21

Registriert seit: 24. Apr 2007
Ort: Golm
18 Beiträge
 
Delphi 4 Standard
 
#1

Delphi: Pointer und Speicher

  Alt 5. Okt 2007, 11:55
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Delphi: Pointer und Speicher

  Alt 5. Okt 2007, 15:09
Zitat von peter21:
Mit AllocMemSize kann man nur den bereits belegten Speicherplatz ermitteln (Dieser hat eine ganz andere Größe, als der, den der Windows Taskmanager ermittelt).
Ser Heap Speicher ist auch nur ein Teil von der Speichermenge für die gesamte App (welche der Taskmanager anzeigt).

Zitat von peter21:
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").
Ich denke, der Eindruck täuscht. Hier wir eher auf eine nicht initialisierte Variable zugegriffen. Würder der Speichermanager keinen Speicher mehr haben, dann würde er entsprechend Bescheid geben (Exception). Es scheint eher ein Programmierfehler im Umgang mit Instanzen, Pointern etc. vorzuliegen.
  Mit Zitat antworten Zitat
peter21

Registriert seit: 24. Apr 2007
Ort: Golm
18 Beiträge
 
Delphi 4 Standard
 
#3

Re: Delphi: Pointer und Speicher

  Alt 6. Okt 2007, 10:49
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
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#4

Re: Delphi: Pointer und Speicher

  Alt 6. Okt 2007, 11:21
Delphi 5 oder 7 ist auch noch ziemlich gut - aber das ist Geschmackssache.

Nimm FastMM um zu überprüfen, ob irgendwo ein Leck ist.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Delphi: Pointer und Speicher

  Alt 6. Okt 2007, 13:25
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...
  Mit Zitat antworten Zitat
peter21

Registriert seit: 24. Apr 2007
Ort: Golm
18 Beiträge
 
Delphi 4 Standard
 
#6

Re: Delphi: Pointer und Speicher

  Alt 7. Okt 2007, 11:52
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:
...
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;
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?
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Delphi: Pointer und Speicher

  Alt 7. Okt 2007, 12:04
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:13 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