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

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

如果代码是用C ++编写的,那么在调用GlobalLock()GlobalUnlock()之间可能会抛出一个exception,如果我不关心这个GlobalUnlock()将不会被调用。

这是一个问题? 如果我调用GlobalLock() ,出于什么原因跳过配对的GlobalUnlock()调用,到底发生了什么?

Solutions Collecting From Web of "如果我调用GlobalLock(),然后调用GlobalUnlock(),会发生什么?"

这个问题不仅是关于你是否调用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应用程序时,所有分配的私人内存将自动释放

更多比你想知道(真正)关于GlobalLock() ,由Raymond Chen提供:

  • LocalAlloc和GlobalAlloc有什么区别?
  • GlobalLock的历史,第1部分:早年
  • GlobalLock的历史,第2部分:选择器
  • GlobalLock的历史,第3部分:过渡到Win32
  • GlobalLock的历史,第4部分:在实施中窥视

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

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