EInvalidPointer bei dispose Befehl.

11/11/2009 - 01:11 von Martin Freiberg | Report spam
Hi,

Ich habe da ein Pointer-Problem mit Freepascal (Unter Linux - Ubuntu).

An unhandled exeception occurred at $0805BA62 : EInvalidPointer :
Invalid pointer operation $0805BA62
$080F1786 DateiClose, line 421 of .
Program exited with code 0331.

Ich reserviere in einer Procedure per "new (FileBuff);" Speicher.
Dann Arbeite ich damit, klappt auch alles, und danach gebe ich den
Speicher wieder mit "dispose (FileBuff);" wieder Frei.
Und immer wenn ich Dispose aufrufe bekomme ich den Fehler EInvalidPointer.

Filebuff : ^array [0..1023] of char;

Filebuff ist global definiert.

Zuerst vermutete ich auch das hier dispose mehrfach aufgerufen wird.

Also habe ich nach dem new Befehl einen writeln in eine Datei eingefügt.
und direkt vor Dispose auch, so das ich die Anzahl der Aufrufe sehen kann.
Ergebnis: new wird genau 1x aufgerufen, und dispose auch nur einmal.
Und ja, nach den writeln für diese Log-Ausgabe in die Datei schließe ich
diese auch gleich wieder mit close.
Dann habe ich mir zusaetzlich auch die Speicheradresse mit ausgeben
lassen, wo die Variable liegt. Die Adresse nach dem New-Befehl und vor
dem Dispose sind identisch.

Wieso schmeist mir dispose einen EInvalidPointer, obwohl die Adresse
stimmt, und dispose auch nur ein mal aufgerufen wird?

Der gdb gibt mir auch exakt die Zeile vom dispose-Befehl aus.

Google hat mich auch nicht weiter gebracht. Wenn jemand den Fehler
hatte, dann wurde entweder dispose mehrfach aufgerufen, oder es wurde
nach dem dispose noch auf den Speicher zugegriffen.


Irgend eine Idee?

Gruß
Martin
 

Lesen sie die antworten

#1 Sieghard Schicktanz
11/11/2009 - 23:11 | Warnen spam
Hallo Martin,

Du schriebst am Wed, 11 Nov 2009 01:11:34 +0100:

[Pointer-Fehler-Beschreibung]>
Irgend eine Idee?



Durchkàmm' Dein Programm doch besser nochmal auf Zugriffe über den Pointer
_nach_ dem Zurückgeben u.à.
Greifst Du auch immer sauber per "<pointer>^" ("^" dahinter!) zu? Falls da
mal ein solches Hüterl verlorengegangen sein sollte, überschreibst Du Dir
die Adresse, so daß der zurückgegebene Speicher nicht mehre derselbe wàre
wie der reservierte - dann knirscht's...

Ansonsten: die Beschreibung ist zu unpràzise, "zeig mal Code". Was machst
Du (bzw. Deine Prozedur) genau wie in welcher Reihenfolge?
Aber bitte erstmal selber durchsuchen - meistens erübrigt sich dann eine
erneute Nachfrage... ;-)

(Weitergabe von Adressdaten, Telefonnummern u.à. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder àhnlichem)
Mit freundlichen Grüßen, S. Schicktanz

Ähnliche fragen