Speicher von System::Drawing::Bitmap freigeben
-
Hi,
ich arbeite immoment mit einer native C++-Klasse für die Webcam-Ansteuerung.
Dazu habe ich eine Wrapper-Klasse und die C++-Klasse in eine Dll gepackt.
In der Wrapper-Klasse wird der char* buffer über myBitmap=gcnew System::Drawing::Bitmap(breite,hoehe,...,pixelbreite,buffer); in ein Bitmap umgewandelt.Dummerweise finde ich keine andere Bitmapfkt die mir aus dem Buffer ein Bitmap macht, also benutze ich bei jedem Bild der Webcam gcnew , was den Speicherverbrauch in die Höhe wachsen läßt.
Jetzt wollte ich nach dem weitergeben des Bildes, das Bild wieder löschen, über Bitmap->Dispose().
Das geht nicht, der Compiler sagt ich solle: Bitmap->~Bitmap() benutzen.
Das geht zwar, aber laut dem Task-Manager, steigt der Speicherverbrauch trotzdem weiter.
Kennt jemand eine Lösung?
Mfg
Reinhold Fischer
-
Klar: delete und achte auch !T und ~T
-
thx für die Antwort.
Aber irgendwie steigt mein Speicherverbrauch trotzdem weiter, obwohl ich jedesmal
delete myBitmap; aufrufe
-
Ohne Quellcode kann man Dir nicht helfen.
Das hier geht ohne Probleme und steigenden Speicherverbrauch:private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { for(int i = 1000;i> 0;--i) { System::Drawing::Bitmap ^ bmp = gcnew System::Drawing::Bitmap("c:\\bg\\vladstudio_coldnight_1280x1024.jpg"); delete bmp; } }
Gibst Du denn bei
char* buffer über myBitmap=gcnew System::Drawing::Bitmap(breite,hoehe,...,pixelbreite,buffer);den buffer übehaupt frei ?
-
Hi, also hier mal der Code:
Wrapper-Klasse zwischen NativeC++ und C++/CLI:
System::Drawing::Bitmap^ KameraWrapper::GetPicture() { char* buffer=myCameraHandler->GetPictureData(); myBitmap=gcnew System::Drawing::Bitmap(myCameraHandler->GetPictureWidth(),myCameraHandler->GetPictureHeight(),3*myCameraHandler->GetPictureWidth(),System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr(buffer))); delete[] buffer; return myBitmap; } void KameraWrapper::DelBitmap() { delete myBitmap; }
Und hier der Code, wo das Bitmap der PictureBox übergeben wird:
pictureBox1->Image=myWrapper->GetPicture(); pictureBox1->Image->RotateFlip(System::Drawing::RotateFlipType::Rotate180FlipX); ResizeAndSavePicture(m_PictureWidth,m_PictureHeight,pictureBox1->Image);
Wenn ich das Bitmap jedoch dnach lösche, kann es die pictureBox nichtmehr anzeigen, ist ja klar.
Mfg
Reinhold Fischer
-
pictureBox1->Image=myWrapper->GetPicture();
Was machst Du mit dem alten Image der pictureBox ?
Wo rust Du DelBitmap auf ?