如果我调用GlobalLock(),然后无法调用GlobalUnlock()会发生什么?

时间:2010-01-29 08:58:58

标签: windows winapi visual-c++ memory-management

在Win32中为了将数据粘贴到剪贴板,我必须调用GlobalAlloc(),然后GlobalLock()来获取指针,然后复制数据,然后调用GlobalUnlock()和{{1} }。

如果代码是在C ++中,则在调用SetClipboardData()GlobalLock()之间可能会抛出异常,如果我不处理此问题,则不会调用GlobalUnlock()

这是一个问题吗?如果我拨打GlobalUnlock()并且出于某种原因跳过配对GlobalLock()来电话会发生什么?

2 个答案:

答案 0 :(得分:9)

由Raymond Chen提供的关于GlobalLock()的超过你真正想知道的事情:

我正在标记此社区维基,因为我实际上不知道这些文章是否回答了您的问题。但它们可能值得趟过,至少对于脱脂而言。

但是,面对异常处理GlobalUnlock()问题的一种方法是使用RAII类来管理GlobalLock() / GlobalUnlock()次调用。

答案 1 :(得分:9)

问题不仅仅在于您是否致电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应用程序时,将自动释放所有已分配的专用内存