Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ungültige Zeigeroperation ??? (https://www.delphipraxis.net/131105-ungueltige-zeigeroperation.html)

thomas2009 18. Mär 2009 23:17


Ungültige Zeigeroperation ???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich erhalte die fehlermeldung, wenn ich das Programm project1.exe schließe " Ungültige Zeigeroperation"

Das liegt vermutlich an eine Bitmap, die ich beim Schließen free zu machen
Delphi-Quellcode:
//...
bmp1 := TBitmap.Create;
bmp1.PixelFormat := pf24bit;
//...
procedure TForm1.FormDestroy(Sender: TObject);
begin
bmp1.free;
end;
Und wenn ich beim Schließen das Bitmap nicht free mache, dann erscheint die Fehlermeldung nicht

Man muss aber das bmp1 free machen

jaenicke 18. Mär 2009 23:41

Re: Ungültige Zeigeroperation ???
 
Kann es sein, dass du fälschlicherweise die Bitmap per direkter Zuweisung in ein TImage gelegt hast z.B.?
Delphi-Quellcode:
Image1.Picture.Bitmap := bmp1;
Das wäre ungünstig, weil dann diese beim Zerstören der Bitmap zu zerstören versucht wird.
Besser lege nur das Bild aus der Bitmap hinein:
Delphi-Quellcode:
Image1.Picture(.Bitmap).Assign(bmp1);
Das .Bitmap sollte gar nicht nötig sein so.

Neutral General 19. Mär 2009 01:12

Re: Ungültige Zeigeroperation ???
 
Hi jaenicke,

Weiß das auch noch nicht so lange aber in der Setter-Methode der Picture-Klasse wird das Bitmap schon assigned. Daran kann es also nicht liegen.

Ich schätze thomas2009 muss uns noch ein bisschen mehr Code offenbaren ;)

jaenicke 19. Mär 2009 01:14

Re: Ungültige Zeigeroperation ???
 
Ja, ok, in dem Fall ja, da kann man ja auch nil zuweisen, ich weiß. Aber an anderen Stellen muss das ja nicht so sein. Mir fällt allerdings kein konkretes anderes Beispiel ein.

Blup 19. Mär 2009 08:47

Re: Ungültige Zeigeroperation ???
 
Ich hätte eigentlich erwartet das thomas2009 Quelltext an seinen Beitrag hängt.
Aus den 3 Zeilen kann man unmöglich die Fehlerursache ermitteln und das Bild der Fehlermeldung bringt auch keine zusätzlichen Informationen.
Meine Glaskugel vermutet eine dieser Varianten:

Das Objekt aus bmp1 wurde einer anderen Variablen zugewiesen und dort freigegeben.
bmp1 := TBitmap.Create;
bmp2 := bmp1; <- eventuell Speicherloch wenn bmp2 bereits auf ein Objekt verweist
bmp2.Free;
bmp1.Free; <- zeigt auf ein Object das es nicht mehr gibt "Ungültige Zeigeroperation"

Der Variablen bmp1 wurde nachträglich ein anderes Objekt zugewiesen, das aber an anderer Stelle freigegeben wird.
bmp1 := TBitmap.Create;
bmp1 := bmp2; <- Speicherloch, das bereits erzeugte Objekt für bmp1 wird nicht freigegeben
bmp2.Free;
bmp1.Free; <- zeigt auf ein Object das es nicht mehr gibt "Ungültige Zeigeroperation"

Für die Variable bmp1 wird mehr als einmal Free aufgerufen.
bmp1 := TBitmap.Create;
bmp1.Free;
bmp1.Free; <- zeigt auf ein Object das es nicht mehr gibt "Ungültige Zeigeroperation"

thomas2009 19. Mär 2009 11:05

Re: Ungültige Zeigeroperation ???
 
Zitat:

Zitat von Blup
...

Für die Variable bmp1 wird mehr als einmal Free aufgerufen.
bmp1 := TBitmap.Create;
bmp1.Free;
bmp1.Free; <- zeigt auf ein Object das es nicht mehr gibt "Ungültige Zeigeroperation"

das lag daran vermutlich
Nun habe ich den Code so geändert:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
if bmp1=nil then bmp1.free;
end;
Nun erscheint Keine Fehlermeldung beim Schließen der Anwendung
Ich hoffe das ist die Lösung :thumb:

DeddyH 19. Mär 2009 11:06

Re: Ungültige Zeigeroperation ???
 
"Wenn es nicht da ist, dann gib es frei" :stupid: . Ich glaube kaum, dass Du das so gemeint hast.

[edit] Um noch einen Tipp loszuwerden: statt
Delphi-Quellcode:
bmp1.Free;
besser
Delphi-Quellcode:
FreeAndNil(bmp1);
verwenden, dann sollte es beim finalen Free keinen Fehler mehr geben, da Free prüft, ob das Objekt nil ist. [/edit]

Blup 19. Mär 2009 16:00

Re: Ungültige Zeigeroperation ???
 
if bmp1=nil then bmp1.free;

Das ist Unsinn. Wenn bmp1 = nil ist, dann darf man durchaus Free aufrufen, es tut nur nichts.
bmp1.Free ohne Bedingung direkt aufzurufen ist also durchaus richtig.

bmp1.free löscht das Objekt, setzt aber die Variable bmp1 nicht auf nil.
bmp1 verweist danach auf einen ungültigen Speicherbereich.
Wird bmp1.free danach ein weiteres mal aufgerufen, erscheint deshalb die Fehlermeldung.

Man kann statt dessen FreeAndNil(bmp1) verwenden.
Dadurch wird sowohl das Objekt als auch die Variable gelöscht, das entspricht:
bmp1.Free;
bmp1 := nil;

Danach ist der erneute Aufruf von bmp1.Free immer zulässig, es gibt aber nichts freizugeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08: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