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 ?


Anmelden zum Antworten