![]() |
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:
Und wenn ich beim Schließen das Bitmap nicht free mache, dann erscheint die Fehlermeldung nicht
//...
bmp1 := TBitmap.Create; bmp1.PixelFormat := pf24bit; //... procedure TForm1.FormDestroy(Sender: TObject); begin bmp1.free; end; Man muss aber das bmp1 free machen |
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:
Das wäre ungünstig, weil dann diese beim Zerstören der Bitmap zu zerstören versucht wird.
Image1.Picture.Bitmap := bmp1;
Besser lege nur das Bild aus der Bitmap hinein:
Delphi-Quellcode:
Das .Bitmap sollte gar nicht nötig sein so.
Image1.Picture(.Bitmap).Assign(bmp1);
|
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 ;) |
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.
|
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" |
Re: Ungültige Zeigeroperation ???
Zitat:
Nun habe ich den Code so geändert:
Delphi-Quellcode:
Nun erscheint Keine Fehlermeldung beim Schließen der Anwendung
procedure TForm1.FormDestroy(Sender: TObject);
begin if bmp1=nil then bmp1.free; end; Ich hoffe das ist die Lösung :thumb: |
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:
besser
bmp1.Free;
Delphi-Quellcode:
verwenden, dann sollte es beim finalen Free keinen Fehler mehr geben, da Free prüft, ob das Objekt nil ist. [/edit]
FreeAndNil(bmp1);
|
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 13:07 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