What happens if I call GlobalLock(), then fail to call GlobalUnlock()?

memory-management, visual-c++, winapi, windows

Solution

The Question is not only about if or if not you call `GlobalUnlock()`. You must call `GlobalUnlock()` and `GlobalFree()`. Both must be called in order to release the memory you allocated:

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;
  }

The leak would be application wide. When you exit a windows application, all allocated private memory is released automatically

Problem

In Win32 in order to paste data into the clipboard I have to call `GlobalAlloc()`, then `GlobalLock()` to obtain a pointer, then copy data, then call `GlobalUnlock()` and `SetClipboardData()`. If the code is in C++ an exception might be thrown between calls to `GlobalLock()` and `GlobalUnlock()` and if I don't take care of this `GlobalUnlock()` will not be called. It this a problem? What exactly happens if I call `GlobalLock()` and for whatever reason skip a pairing `GlobalUnlock()` call?

Original source