Ungültige Zeigeroperation - Delphi XE

8

Ich kann mir das nicht vorstellen. Mein Programm kompiliert und läuft erfolgreich, aber während des Debuggens erscheint nur eine Meldung mit der Meldung "Ungültiger Zeigerbetrieb" beim Herunterfahren des Programms. Ich habe sorgfältig alle FormCloseQuery und FormDestory Ereignisse für jede Syntax oder logischen Fehler überprüft. Ich habe keine gefunden und sie führen wie erwartet ohne Fehler aus.

Wenn ich dem Compiler erzähle, bei Ungültiger Pointer-Operation-Fehler zu brechen, macht er nichts, aber legt das Programm auf. An diesem Punkt musste ich den Prozess beenden oder beenden.

Wie findest du das heraus?

Vielen Dank im Voraus,

    
ThN 11.04.2012, 20:04
quelle

4 Antworten

25

Eine ungültige Zeigerausnahme wird vom Speichermanager ausgelöst, wenn versucht wird, ungültigen Speicher freizugeben. Es gibt drei Möglichkeiten, dies zu tun.

Die häufigste Ursache ist, dass Sie versuchen, ein Objekt freizugeben, das Sie bereits freigegeben haben. Wenn Sie FastMMs FullDebugMode einschalten, wird dies erkannt und Sie direkt auf das Problem hingewiesen. (Stellen Sie jedoch sicher, dass Sie eine Map-Datei erstellen, damit sie über die Informationen verfügt, die zum Erstellen nützlicher Stack-Traces erforderlich sind.)

Der zweite Weg ist, wenn Sie versuchen, Speicher freizugeben, der irgendwo anders als dem Speichermanager zugewiesen wurde. Ich habe dies einige Male gesehen, als ich eine Zeichenfolge von einer Delphi-EXE an eine Delphi-DLL übergeben habe, die nicht die Shared-Memory-Manager-Funktion verwendet hat.

Und der dritte Weg besteht darin, direkt mit den Zeigern herumzublödeln und trifft wahrscheinlich nicht auf Sie zu. Wenn Sie versuchen, FreeMem oder Dispose einen ungültigen Zeiger zu verwenden, der sich nicht auf einen tatsächlichen Speicherblock bezieht, der von FastMM zugewiesen wurde, erhalten Sie diesen Fehler.

Es ist wahrscheinlich der erste. Verwenden Sie FullDebugMode und Sie finden die Quelle des Problems leicht.

    
Mason Wheeler 11.04.2012, 20:30
quelle
9

Ungültige Zeigeroperationen treten auf, wenn Sie dem Delphi-Speichermanager mitteilen, Speicher freizugeben, der nicht zu ihm gehört. Es gibt drei Möglichkeiten, die passieren können:

  • Freigeben eines Zeigers oder Objekts, das bereits freigegeben wurde.
  • Verwenden von FreeMem , um etwas freizugeben, das von einem anderen Speichermanager zugewiesen wurde (z. B. GlobalAlloc oder CoTaskMemAlloc ).
  • Freigeben eines nicht initialisierten Zeigers. (Dies unterscheidet sich von der Freigabe eines Nullzeigers, der völlig sicher ist.)

Irgendwo in deinem Programm machst du eines dieser Dinge. Der Debugger hat die vom Speichermanager ausgelöste Ausnahme erkannt, also auch Debugging. Von der Stack-Ablaufverfolgung sollten Sie sehen können, welche Variable Sie freigeben möchten. Überprüfen Sie den Rest Ihres Programms auf andere Arten, wie diese Variable verwendet wird.

Tools wie MadExcept und Eureka Log können Ihnen helfen, doppelte Fehler zu finden. Sie können verfolgen, wo der fragliche Zeiger zugewiesen wurde und wo er beim ersten Mal freigegeben wurde, und das ist manchmal genug Information, um Ihren Fehler herauszufinden und die Dinge nicht mehr zu löschen.

    
Rob Kennedy 18.01.2013 15:33
quelle
1

Ein vierter Grund, warum eine ungültige Zeigeroperation auftreten kann. Ich hatte zwei Zeiger, die Array [0..1000] von Real und einen dritten Zeiger, der ein Array [1..200] von Real war. Alle 3 Zeiger wurden mit initialisiert  für i: = 0 bis 1000 tun    Start     ptr1 ^ [i]: = 0; ptr2 ^ [i]: = 0; ptr3 ^ [i]: = 0;    Ende; Während diese schlechte Programmierung Pascal in Delphi nicht störte, führte ein Aufruf von Dispose für einen der 3 Zeiger zu einer ungültigen Zeigeroperation. Der Fix war einfach, den 3. Zeiger richtig zu initialisieren.

    
Dick Brown 23.09.2016 21:07
quelle
0

Ich bin von dieser Art von "indicated error" beim Delphi-Debuggen überrascht worden.

Überprüfen Sie, ob Sie beobachtete Variablen mit "Function Calls erlauben" aktiviert haben oder ob Sie versuchen, andere Variablen in derselben Einheit (oder global) anzuzeigen, die möglicherweise nicht initialisiert sind. Beim Anhalten an einem Haltepunkt kann Delphis Debugger versuchen, den Wert über einen Funktionsaufruf anzuzeigen, der auf einen nicht initialisierten Zeiger oder eine Variable zugreift. Die tatsächliche Variable, die den AV verursacht, ist nicht einmal auf deiner Beobachtungsliste.

    
Despatcher 18.01.2013 14:28
quelle