在Win32中为了将数据粘贴到剪贴板,我必须调用GlobalAlloc()
,然后GlobalLock()
来获取指针,然后复制数据,然后调用GlobalUnlock()
和{{1} }。
如果代码是在C ++中,则在调用SetClipboardData()
和GlobalLock()
之间可能会抛出异常,如果我不处理此问题,则不会调用GlobalUnlock()
。
GlobalUnlock()
并且出于某种原因跳过配对GlobalLock()
来电话会发生什么?
答案 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应用程序时,将自动释放所有已分配的专用内存