2010-01-29 85 views
6

在Win32中为了将数据粘贴到剪贴板我必须拨打GlobalAlloc(),然后GlobalLock()获取一个指针,然后复制数据,然后调用GlobalUnlock()SetClipboardData()如果我调用GlobalLock()然后调用GlobalUnlock()会发生什么?

如果代码是C++的例外可能调用之间掀翻GlobalLock()GlobalUnlock(),如果我不带这个GlobalUnlock()照顾不会被调用。

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

回答

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应用程序时,所有分配的私有内存都会自动释放

+1

不可以,如果数据粘贴到剪贴板,则不应调用GlobalFree() - 将所有权传递给剪贴板,并且稍后将释放内存。 – sharptooth 2010-01-29 10:13:18

+1

是的你是对的,如果SetClipboardData的调用已经成功。但除此之外,你必须调用两者。后相应修改。 – 2010-01-29 10:20:13

9

比你曾经想知道(真的)约GlobalLock(),雷蒙德陈的礼貌:

我正在标记这个社区wiki,因为我其实不知道这些文章是否回答你的问题。但他们可能值得通过,至少是一瞥。

但面对例外情况,处理GlobalUnlock()问题的一种方法是使用RAII类来管理GlobalLock()/GlobalUnlock()调用。

相关问题