![]() |
TBitmap free? Invalid Pointer Operation
hallo!
habe folgenden Code, der zwar funktioniert, beim beenden des Programms aber "invalid pointer operation" ergibt:
Delphi-Quellcode:
Wenn ich das free weglasse geht es. Sorry für die Basic-Frage, aber muss ich das Objekt nicht freigeben? Wenn ja, warum dann die Fehlermeldung? und wie richtig?
var
bmp : TBitmap; begin bmp := TBitmap.Create; bmp := Image1.Picture.Bitmap; (snip) bmp.free; end; nochmals sorry, wenn das basic ist. dank und gruß tom |
Re: TBitmap free? Invalid Pointer Operation
Du weist der Referenz bmp zunächst ein neues Objekt zu (Rückgabewert des Konstruktors, wenn man so will), und dann weist du ihm ein anderes Objekt zu (Image1.Picture.Bitmap). Du kannst entweder den Konstruktoraufruf weglassen (dann muss dir klar sein, dass du dasselbe Objekt referenzierst), oder statt der Zuweisung machst du bmp.Assign(Image1.Picture.Bitmap), dann wird die Bitmap nach bmp kopiert.
|
Re: TBitmap free? Invalid Pointer Operation
Delphi-Quellcode:
:zwinker:
var
bmp : TBitmap; begin bmp := TBitmap.Create; bmp.Assign( Image1.Picture.Bitmap ); // <--<< // (snip) // bmp.free; end; |
Re: TBitmap free? Invalid Pointer Operation
so wie der quelltext dort steht müsste man free aufrufen.
was machst du denn zwischen durch? |
Re: TBitmap free? Invalid Pointer Operation
danke Euch einmal.
Zitat:
Zitat:
Zitat:
|
Re: TBitmap free? Invalid Pointer Operation
Zitat:
|
Re: TBitmap free? Invalid Pointer Operation
ps. Vielleicht noch zur Erklärung was passiert:
Die Zuweisung bmp := Image1.Picture.Bitmap; steht in einer Schleife, in der immer wieder das Image neu gezeichnet wird, dann auf das bmp kopiert und das bmp in den AVICreator |
Re: TBitmap free? Invalid Pointer Operation
Zitat:
Aber noch nichtmal das: es ist ein und das selbe Objekt und somit würde ein Zeichnen auf dem Bmp dies auch sofort auf dem Image anzeigen, da es sich um das gleiche Bild/Objekt handelt. |
Re: TBitmap free? Invalid Pointer Operation
ok, danke.
Also in der Minimalfassung habe ich jetzt nur noch die Zuweisung bmp := Image1.Picture.Bitmap; ohne create und ohne free und es geht reibungslos. Irgendwelche Haken oder Einwände? |
Re: TBitmap free? Invalid Pointer Operation
Die Einwände wären lediglich das du wohl nicht weiß warum das so ok ist. Ansonsten ist es ok
folgendes ist dein Ausgangspost:
Delphi-Quellcode:
zu beachten ist aber das Image1.Picture.Bitmap von Image1 (TImage) bereits erstellt (TBitmap.Create()) wurde.
var
bmp : TBitmap; begin bmp := TBitmap.Create; //1 bmp := Image1.Picture.Bitmap; //2 (snip) bmp.free; //3 end; genau genommen machst du im Ausgangspost folgendes: 1.) Du forderst Speicher an und weißt merkst dir die Adresse darauf in der Variablen "bmp" 2.) Du lässt die Variable "bmp" jetzt auf Image1.Picture.Bitmap zeigen. Jetzt zeigt aber nichts mehr auf den zuvor angeforderten Speicher der mit "TBitmap.Create" angefordert wurde. Dadurch kannst du den Speicher nicht mehr frei geben und hast ein Speicherleck 3.) Du gibst den Speicher frei welchen Image1 (TImage) angefordert hat. Du solltest aber generell nur Dinge frei geben die du auch selbst angefordert hast. Das hattest du sicher auch vor was aber durch
Delphi-Quellcode:
in die Hose geht.
bmp := Image1.Picture.Bitmap;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 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