资源泄漏 - 设备上下文过多
Resource leak - too many device contexts
我有一个(通常)工作的 C++/Windows 程序,我注意到它有图形资源泄漏。我使用了 GDIView 并将其追溯到设备上下文的构建。
进一步观察,我将其追踪到一对线(参见评论 "Line A" 和 "Line B"),如下所示:
hdc = BeginPaint(hwnd,&global_paintstruct);
handle_of_source_device_context = CreateCompatibleDC(GetDC(0)); // Line A
#if 0 // temporarily while debugging
// stuff using handle_of_source_device_context
#endif
DeleteDC(handle_of_source_device_context); // Line B
EndPaint(hwnd,&global_paintstruct);
如果我注释掉 A 行和 B 行,那么就没有资源泄漏。
我测试了DeleteDC returns 1.
有什么想法吗?
在 GetDC 的 return 值上调用 ReleaseDC:
dc = GetDC(0)
...
ReleaseDC(dc);
您需要在不再需要 DC 时调用 ReleaseDC
以防止 GDI 泄漏。您的代码的固定版本将如下所示:
hdc = BeginPaint(hwnd,&global_paintstruct);
HDC hWndDC = GetDC(NULL);
handle_of_source_device_context = CreateCompatibleDC(hWndDC); // Line A
#if 0 // temporarily while debugging
// stuff using handle_of_source_device_context
#endif
ReleaseDC(hWndDC);
ReleaseDC(handle_of_source_device_context);
DeleteDC(handle_of_source_device_context); // Line B
EndPaint(hwnd,&global_paintstruct);
我有一个(通常)工作的 C++/Windows 程序,我注意到它有图形资源泄漏。我使用了 GDIView 并将其追溯到设备上下文的构建。
进一步观察,我将其追踪到一对线(参见评论 "Line A" 和 "Line B"),如下所示:
hdc = BeginPaint(hwnd,&global_paintstruct);
handle_of_source_device_context = CreateCompatibleDC(GetDC(0)); // Line A
#if 0 // temporarily while debugging
// stuff using handle_of_source_device_context
#endif
DeleteDC(handle_of_source_device_context); // Line B
EndPaint(hwnd,&global_paintstruct);
如果我注释掉 A 行和 B 行,那么就没有资源泄漏。
我测试了DeleteDC returns 1.
有什么想法吗?
在 GetDC 的 return 值上调用 ReleaseDC:
dc = GetDC(0)
...
ReleaseDC(dc);
您需要在不再需要 DC 时调用 ReleaseDC
以防止 GDI 泄漏。您的代码的固定版本将如下所示:
hdc = BeginPaint(hwnd,&global_paintstruct);
HDC hWndDC = GetDC(NULL);
handle_of_source_device_context = CreateCompatibleDC(hWndDC); // Line A
#if 0 // temporarily while debugging
// stuff using handle_of_source_device_context
#endif
ReleaseDC(hWndDC);
ReleaseDC(handle_of_source_device_context);
DeleteDC(handle_of_source_device_context); // Line B
EndPaint(hwnd,&global_paintstruct);