Warum kommt der PictureBox Laderoutine Leck-Speicher?
-
21-09-2019 - |
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?
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