为什么释放DC()
Why ReleaseDC()?
我正在开发MFC应用程序,在空闲处理循环中,我曾遇到过一些奇怪的访问违规错误。
经过一些研究,我发现这可能是由未释放的DC引起的。我在每次GetDC()调用后都调用了ReleaseDC()函数,错误停止出现。
我不明白的是为什么我必须调用ReleaseDC()。例如:
void CMainFrame::OnUpdateStatusLODLevel(CCmdUI *pCmdUI)
{
pCmdUI->Enable();
RenderingStatistics Stats = theApp.xAM->GetRenderingStatistics();
std::wstring wsText;
wsText = L"LOD: ";
wsText += std::to_wstring(Stats.uiCurrentLOD);
pCmdUI->SetText(wsText.c_str());
CDC* dc = m_wndStatusBar.GetDC();
if (dc){
CSize size = dc->GetTextExtent(wsText.c_str());
m_wndStatusBar.SetPaneWidth(m_wndStatusBar.CommandToIndex(ID_STATUS_BAR_LOD_LEVEL), size.cx);
ReleaseDC(dc); // without this call Access Violation errors appears
}
}
chris说:
如果你拿了DC,你应该在完成后把它还给别人。它就像就这么简单。
他/她是对的。
一些程序员说:
计算机上的资源不是无限的,包括句柄、设备上下文、文件等。如果你继续分配资源而不释放它们,系统迟早会运行资源不足。
他/她也是对的。
你应该听他们的。
其他应用程序和进程,甚至是当前进程和应用程序中的其他线程,在应用程序调用/调用ReleaseDC
之前,将无法使用GetDC
或GetWindowDC
检索窗口的设备上下文。
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 为什么释放DC()
- 可视C++:错误 C2664:"释放DC":无法将参数 1 从"HDC"转换为"HWND"