Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TBitmap free? Invalid Pointer Operation (https://www.delphipraxis.net/101161-tbitmap-free-invalid-pointer-operation.html)

cltom 9. Okt 2007 10:50


TBitmap free? Invalid Pointer Operation
 
hallo!

habe folgenden Code, der zwar funktioniert, beim beenden des Programms aber "invalid pointer operation" ergibt:

Delphi-Quellcode:
var
  bmp : TBitmap;

begin
  bmp := TBitmap.Create;
  bmp := Image1.Picture.Bitmap;
 
  (snip)

  bmp.free;
end;
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?

nochmals sorry, wenn das basic ist.
dank und gruß
tom

OregonGhost 9. Okt 2007 10:53

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.

turboPASCAL 9. Okt 2007 10:56

Re: TBitmap free? Invalid Pointer Operation
 
Delphi-Quellcode:
var
  bmp : TBitmap;

begin
  bmp := TBitmap.Create;
  bmp.Assign( Image1.Picture.Bitmap ); // <--<<
 
  // (snip) //

  bmp.free;
end;
:zwinker:

semo 9. Okt 2007 10:57

Re: TBitmap free? Invalid Pointer Operation
 
so wie der quelltext dort steht müsste man free aufrufen.

was machst du denn zwischen durch?

cltom 9. Okt 2007 11:09

Re: TBitmap free? Invalid Pointer Operation
 
danke Euch einmal.


Zitat:

Zitat von OregonGhost
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.

jop, wenn ich das Create weglasse, gibt es auch kein Problem. Bis dato die beste Lösung.


Zitat:

Zitat von turboPASCAL
[delphi]
bmp.Assign( Image1.Picture.Bitmap ); // <--&lt;&lt;

Das entfernt die "invalid pointer operation" meldung, führt aber zu einer allgemeinen Schutzverletzung. Was wohl nicht an Deiner Lösung liegt sondern an einem Seiteneffekt mit dem Avicreator (siehe unten)

Zitat:

Zitat von M. Hassmann
so wie der quelltext dort steht müsste man free aufrufen.
was machst du denn zwischen durch?

es sollen/werden mehrere bitmaps aus images erstellt und die via AVICreator in ein AVI-File geschrieben. Das geht auch schon problemlos über andere Wege (bitmaps aus der clipboard einfügen). Wenn ich das bitmap aber wie oben zuweise (create, assign, free - oder auch create, := und free) gibt es beim Beenden Fehlermeldungen.

cltom 9. Okt 2007 11:12

Re: TBitmap free? Invalid Pointer Operation
 
Zitat:

Zitat von OregonGhost
dann muss dir klar sein, dass du dasselbe Objekt referenzierst

sorry, aber was wäre das Problem dabei?

cltom 9. Okt 2007 11:14

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

Muetze1 9. Okt 2007 11:15

Re: TBitmap free? Invalid Pointer Operation
 
Zitat:

Zitat von cltom
Zitat:

Zitat von OregonGhost
dann muss dir klar sein, dass du dasselbe Objekt referenzierst

sorry, aber was wäre das Problem dabei?

Das das Bitmap dem Image gehört. Wenn du dann dein Bmp freigibst, dann gibst du damit das Objekt frei, welches Image gehört und ziehst es dem Image damit unter den Füssen weg.

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.

cltom 9. Okt 2007 11:16

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?

SirThornberry 9. Okt 2007 11:20

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:
var
  bmp : TBitmap;

begin
  bmp := TBitmap.Create; //1
  bmp := Image1.Picture.Bitmap; //2
 
  (snip)

  bmp.free; //3
end;
zu beachten ist aber das Image1.Picture.Bitmap von Image1 (TImage) bereits erstellt (TBitmap.Create()) wurde.

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:
bmp := Image1.Picture.Bitmap;
in die Hose geht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr.
Seite 1 von 2  1 2      

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