Что происходит, если я называю GlobalLock (), затем не удаюсь назвать GlobalUnlock ()?

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

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

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

6
задан RED SOFT ADAIR 29 January 2010 в 10:05
поделиться

2 ответа

Вопрос не только если или если не звонить 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
ответ дан 8 December 2019 в 12:59
поделиться

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

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

Но один из способов справиться с вашей проблемой справиться с GlobalunLock () перед лицом исключения, состоит в том, чтобы использовать класс Raii для управления Globallock () / Globalunlock () [) звонки.

9
ответ дан 8 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: