Почему моя процедура загрузки PictureBox приводит к утечке памяти?

StackOverflow https://stackoverflow.com/questions/1566045

Вопрос

Я был попытка поменять местами изображения в 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 КБ при каждом нажатии кнопки?

Это было полезно?

Решение

два слова:вывоз мусора

Другие советы

Как ни странно, на самом деле это происходит, когда вы наводите курсор мыши на кнопку.Каждый раз, когда вы это делаете, память прыгает, но после достаточного количества наведений мыши использование памяти стабилизируется.Фактические нажатия на кнопку (т.вызовы моей программы) не вызывают никаких утечек.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top