2010-01-29 149 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()調用。

相關問題