¿Por qué mi cuadro de imagen de cargar la memoria de fugas de rutina?
-
21-09-2019 - |
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?
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