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é?

Était-ce utile?

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
scroll top