AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TBitmap free? Invalid Pointer Operation

Ein Thema von cltom · begonnen am 9. Okt 2007 · letzter Beitrag vom 9. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#1

TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 11:50
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
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 11:53
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#3

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 11:56
Delphi-Quellcode:
var
  bmp : TBitmap;

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

  bmp.free;
end;
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#4

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 11:57
so wie der quelltext dort steht müsste man free aufrufen.

was machst du denn zwischen durch?
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#5

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 12:09
danke Euch einmal.


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 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 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.
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#6

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 12:12
Zitat von OregonGhost:
dann muss dir klar sein, dass du dasselbe Objekt referenzierst
sorry, aber was wäre das Problem dabei?
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#7

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 12:14
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 12:15
Zitat von cltom:
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.
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#9

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 12:16
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: TBitmap free? Invalid Pointer Operation

  Alt 9. Okt 2007, 12:20
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
bmp := Image1.Picture.Bitmap; in die Hose geht.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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