Pregunta

He estado tratando de intercambiar imágenes en un cuadro de imagen en una aplicación C ++ / CLI, pero mi solución parece tener una pérdida de memoria:

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

Por lo que yo puedo ver, estoy explícitamente la liberación de la memoria, de modo ¿por qué informe de un administrador de tareas ~ 24k aumento en la memoria cada vez que se hace clic en el botón?

¿Fue útil?

Solución

dos palabras: la recolección de basura

Otros consejos

Curiosamente, esto se ve en realidad que es causada cuando el ratón sobre el botón. Cada vez que se hace que la memoria salta pero después de ratón de créditos suficientes de que el uso de memoria se estabilice. Los clics reales en el botón (es decir, las llamadas a mi rutina) no causan ninguna fuga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top