Что произойдет, если я вызову GlobalLock (), а затем не вызову GlobalUnlock ()? - PullRequest
6 голосов
/ 29 января 2010

В Win32 для вставки данных в буфер обмена мне нужно вызвать GlobalAlloc(), затем GlobalLock(), чтобы получить указатель, затем скопировать данные, затем вызвать GlobalUnlock() и SetClipboardData().

Если код находится на C ++, между вызовами GlobalLock() и GlobalUnlock() может возникнуть исключение, и если я не позабочусь об этом, GlobalUnlock() не будет вызван.

Это проблема? Что именно произойдет, если я позвоню GlobalLock() и по какой-либо причине пропущу соединение GlobalUnlock() вызов?

Ответы [ 2 ]

9 голосов
/ 29 января 2010

Вопрос не только в том, звоните ли вы GlobalUnlock() или нет. Вы должны позвонить GlobalUnlock() и GlobalFree(). Оба должны быть вызваны для освобождения выделенной памяти:

HGLOBAL hdl = NULL;
void *ptr = NULL

  try {
    hdl = GlobalAlloc();
    ptr = GlobalLock(hdl);

    // etc...
    GlobalUnlock(hdl);
    ptr = NULL;
    SetClipboardData(..., hdl );
  }
  catch (...) {
    if(ptr)
        GlobalUnlock(hdl);
    if(hdl)
        GlobalFree(hdl);
    throw;
  }

Утечка будет иметь широкое применение. При выходе из приложения Windows вся выделенная личная память освобождается автоматически

9 голосов
/ 29 января 2010

Больше, чем вы когда-либо хотели знать (на самом деле) о GlobalLock(), любезно предоставлено Рэймондом Ченом:

Я отмечаю эту вики сообщества, потому что на самом деле не знаю, отвечают ли эти статьи на ваш вопрос. Но им, вероятно, стоит пройтись, хотя бы для снятия денег.

Но один из способов справиться с проблемой работы с GlobalUnlock () перед лицом исключений - это использовать класс RAII для управления вызовами GlobalLock() / GlobalUnlock().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...