Frage

Ich bin versuchen, Swap-Bilder in einer PictureBox in einem C ++ / CLI-Anwendung aber meine Lösung erscheint ein Speicherleck zu haben:

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);
}

Soweit ich sehen kann, ich bin die Freigabe explizit den Speicher so, warum Task-Manager-Bericht sieht eine ~ 24k Erhöhung der Speicher jedes Mal auf die Schaltfläche geklickt wird?

War es hilfreich?

Lösung

zwei Worte: Garbage Collection

Andere Tipps

Seltsam, das sieht tatsächlich verursacht werden, wenn Sie den Mauszeiger über die Schaltfläche. Jedes Mal, wenn Sie zu tun, dass der Speicher springt aber nach genug Maus-overs, dass die Speicherauslastung stabilisiert. Die tatsächlichen Klicks auf die Schaltfläche (das heißt Anrufe zu meiner Routine) keine Leckage verursachen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top