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

sha*_*oth 6 windows winapi memory-management visual-c++

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

如果代码是在C++中,则可能在调用之间抛出异常GlobalLock(),GlobalUnlock()并且如果我不处理,GlobalUnlock()则不会调用它.

这是一个问题吗?如果我打电话GlobalLock(),无论出于何种原因跳过配对GlobalUnlock()电话会发生什么?

Mic*_*urr 9

GlobalLock()Raymond Chen提供的不仅仅是你想知道的(真的).

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

但是,在异常情况下处理GlobalUnlock()问题的一种方法是使用RAII类来管理GlobalLock()/ GlobalUnlock()调用.


RED*_*AIR 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;
  }
Run Code Online (Sandbox Code Playgroud)

泄漏将适用于整个应用范围.退出Windows应用程序时,将自动释放所有已分配的专用内存