2009-10-14 6 views
0

J'ai été trying to swap images in a PictureBox in a C++/CLI application mais ma solution semble avoir une fuite de mémoire:Pourquoi ma routine de chargement de PictureBox perd-elle de la 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 un ~ 24k augmentation de la mémoire chaque fois que le bouton est cliqué?

Répondre

1

deux mots: la collecte des ordures

+0

C'était ma réaction initiale, mais explicitement supprimé les objets devraient contourner ces effets ne devraient-ils pas? –

+0

Je pense que le nettoyage ne fera que nettoyer le côté non géré. Le reste sera nettoyé par GC à un moment ultérieur ... – KristoferA

+0

Cela aurait du sens .. –

0

Bizarrement, cela semble effectivement être causé lorsque vous la souris sur le bouton. Chaque fois que vous faites cela, la mémoire saute, mais après un nombre de souris suffisant, l'utilisation de la mémoire se stabilise. Les clics réels sur le bouton (c'est-à-dire les appels à ma routine) ne provoquent aucune fuite.

Questions connexes