Frage zur Speicherverwaltung
-
Hallo zusammen,
ich habe eine (vielleicht dumme) Frage zur Speicherverwaltung. Ich habe eine Klasse TProcessImage und TForm1 (das Formular). In TProcessImage habe ich nun eine Funktion
Graphics::TBitmap * TProcessImage::SetCircleOfInterest(IplImage * source, int x, int y, int radius) { Graphics::TBitmap *bitmap; bitmap = new Graphics::TBitmap; IplImageToTBitmap(source, bitmap); bitmap->Canvas->Ellipse(x - radius, y - radius, x + radius, y + radius); CircelofInterest.x = x; CircelofInterest.y = y; CircelofInterest.width = radius; CircelofInterest.height = radius; return bitmap; }die von TForm1 aus aufgerufen wird:
void __fastcall TForm1::TBRadiusChange(TObject *Sender) { if (myPI != NULL) { Image5->Picture->Bitmap = myPI->SetCircleOfInterest(myPI->SrcImage, TBX->Position, TBY->Position, TBRadius->Position); EdRadius->Text = IntToStr(TBRadius->Position); } } //---------------------------------------------------------------------------Mit TBRadiusChange wird mit einem Trackbar der Mittelpunkt einer Ellipse verschoben. Meine Frage ist nun, ob nach jedem Aufruf der Funktion
Graphics::TBitmap * TProcessImage::SetCircleOfInterest der von der Funktion belegte Speicher wieder frei gegeben wird, oder ob ich das von Hand machen muss und wenn ja wie.
Wenn ich TBRadiusChange häufig aufrufe, kommt irgendwann eine Exception, dass kein Speicherplatz mehr zur Verfügung steht. Ich hoffe meine Frage ist verständlich, sonst bitte einfach nachfragen...Gruss
Lodo2609
-
Nein, um die Speicherverwaltung mußt du dich selber kümmern - C++ hat keinen Garbage Collector. Und das bedeutet, daß du das alte Objekt per delete entsorgen mußt, bevor du den letzten Bezug auf es verlierst (sprich - vor der Zuweisung).
-
(sprich - vor der Zuweisung).
Danke für die Antwort. Mir ist nicht ganz klar, vor welcher Zuweisung: Vor dem
return bitmapin der TProcessImage-Funktion oder wo?
Danke
Gruss Lodo2609
-
Du mußt das delete dort aufrufen, wo du das bisherige Objekt nicht mehr benötigst - vor dem return ist also definitiv falsch. Ich meinte eher die Zuweisung in der TForm-Methode (durch das ...->Bitmap = ... signalisierst du, daß das alte Bitmap nicht mehr benötigt wird, also solltest du es entsorgen, bevor du die Verbindung darauf verlierst).
(btw, Smart-Pointer sind echt praktisch, um solche Probleme zu vermeigen)