Pourquoi mon chargement PictureBox mémoire de fuite de routine?
-
21-09-2019 - |
Question
Je suis essayer d'échanger des images dans un PictureBox dans une application C ++ / CLI mais ma solution semble avoir une fuite de mémoire:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
// Pick a new bitmap
static int resource = IDB_BITMAP1;
if( resource == IDB_BITMAP2)
{
resource = IDB_BITMAP1;
}
else
{
resource = IDB_BITMAP2;
}
// Get the primary module
Module^ mod = Assembly::GetExecutingAssembly()->GetModules()[0];
// Get the instance handle
IntPtr hinst = Marshal::GetHINSTANCE(mod);
// Get the bitmap as unmanaged
HANDLE hbi = LoadImage((HINSTANCE) hinst.ToPointer(),MAKEINTRESOURCE(resource),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);
// Import the unmanaged bitmap into the managed side
Bitmap^ bi = Bitmap::FromHbitmap(IntPtr(hbi));
// Remove any previously stored images
if(m_pictureBox1->Image != nullptr)
{
delete m_pictureBox1->Image;
m_pictureBox1->Image = nullptr;
}
// Insert the bitmap into the picture box
m_pictureBox1->Image = bi;
// Free up the unmanaged bitmap
DeleteObject(hbi);
}
Pour autant que je peux voir, je libérer la mémoire afin explicitement pourquoi est-gestionnaire de tâches rapport une ~ 24k augmentation de la mémoire à chaque fois que le bouton est cliqué?
La solution
deux mots: la collecte des ordures
Autres conseils
Bizarrement, cela semble effectivement être causé lorsque vous la souris sur le bouton. Chaque fois que vous faites que la mémoire saute mais après suffisamment de souris overs que l'utilisation de la mémoire se stabilise. Les clics réels sur le bouton (à savoir les appels à ma routine) ne provoquent pas de fuite.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow