В Win32 для вставки данных в буфер обмена, который я должен назвать GlobalAlloc()
, затем GlobalLock()
для получения указателя затем скопируйте данные, затем звоните GlobalUnlock()
и SetClipboardData()
.
Если код находится в C++, исключение могло бы быть выдано между вызовами к GlobalLock()
и GlobalUnlock()
и если я не забочусь об этом GlobalUnlock()
не будет назван.
Это это проблема? Что точно происходит, если я звоню GlobalLock()
и поскольку любая причина пропускают соединение GlobalUnlock()
звонить?
Вопрос не только если или если не звонить 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, все выделенные частные памяти автоматически выпускаются
Больше, чем вы когда-либо хотели узнать (действительно) о Globallock ()
, вежливость Рэймонда Чэнь:
Я отмечаю этот сообщество Wiki, потому что я на самом деле не знаю, отвечают ли эти статьи на ваш вопрос. Но они, вероятно, стоит проходить, по крайней мере, для обезжиренного.
Но один из способов справиться с вашей проблемой справиться с GlobalunLock () перед лицом исключения, состоит в том, чтобы использовать класс Raii для управления Globallock ()
/ Globalunlock () [)
звонки.