Почему моя процедура загрузки PictureBox приводит к утечке памяти?
-
21-09-2019 - |
Вопрос
Я был попытка поменять местами изображения в PictureBox в приложении C++/CLI но мое решение, похоже, имеет утечку памяти:
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);
}
Насколько я вижу, я явно освобождаю память, так почему же диспетчер задач сообщает об увеличении памяти примерно на 24 КБ при каждом нажатии кнопки?
Решение
два слова:вывоз мусора
Другие советы
Как ни странно, на самом деле это происходит, когда вы наводите курсор мыши на кнопку.Каждый раз, когда вы это делаете, память прыгает, но после достаточного количества наведений мыши использование памяти стабилизируется.Фактические нажатия на кнопку (т.вызовы моей программы) не вызывают никаких утечек.
Не связан с StackOverflow