sha*_*oth 6 windows winapi memory-management visual-c++
在Win32中为了将数据粘贴到我必须调用的剪贴板中GlobalAlloc(),然后GlobalLock()获取指针,然后复制数据,然后调用GlobalUnlock()和SetClipboardData().
如果代码是在C++中,则可能在调用之间抛出异常GlobalLock(),GlobalUnlock()并且如果我不处理,GlobalUnlock()则不会调用它.
这是一个问题吗?如果我打电话GlobalLock(),无论出于何种原因跳过配对GlobalUnlock()电话会发生什么?
GlobalLock()Raymond Chen提供的不仅仅是你想知道的(真的).
我正在标记这个社区维基,因为我实际上不知道这些文章是否回答了你的问题.但它们可能值得趟过,至少对于脱脂而言.
但是,在异常情况下处理GlobalUnlock()问题的一种方法是使用RAII类来管理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;
}
Run Code Online (Sandbox Code Playgroud)
泄漏将适用于整个应用范围.退出Windows应用程序时,将自动释放所有已分配的专用内存
| 归档时间: |
|
| 查看次数: |
5032 次 |
| 最近记录: |