我有一个很大的旧程序,它有一些相当复杂的图形显示(都通过标准的API调用)。该程序似乎工作正常,但我最近查看了Windows任务管理器的“句柄”字段,当该程序运行时,并注意到句柄的数量逐渐且无情地向上爬行。
我是否可以使用一些软件或策略来追踪这个流氓手柄的创建?
我希望该程序能够创建大量句柄,但我也希望它能达到极限。所以我真正想看到的是代码的哪一部分正在创建最新的句柄。
编辑:在使用“Process Explorer”进行一些调查后,我发现爬行的东西是“Handles”,而不是“GDI Handles”。所以我想这意味着它与复杂的图形无关。
答案 0 :(得分:2)
答案 1 :(得分:0)
解决此问题的最佳方法是使用RAII design pattern。
对于您创建的每个句柄,您将其包装在一个类中。
例如:
class CAutoHandle
{
public:
CAutoHandle(HANDLE handle) : m_handle(handle)
{
}
~CAutoHandle()
{
CloseHandle(m_handle);
}
HANDLE m_handle;
};
@JaredPar还建议使用另一个解决方案here,在其中重新定义CreateFile以调用您自己的具有跟踪功能。
答案 2 :(得分:0)
您可以使用Memory Validator查找句柄泄漏。试试Eval版本。
答案 3 :(得分:0)
句柄可以是很多东西,不仅仅是文件句柄,还有GUI对象(如创建图标和使用DeleteObject()而不是DestroyIcon()删除它的怪癖)。
有一篇MSDN文章,介绍了各种技术: http://msdn.microsoft.com/en-us/magazine/cc301756.aspx和一个名为Leaks.exe的程序包(假设您仍然可以在W95下运行代码)
答案 4 :(得分:0)
创建HANDLE的其他函数是CreateThread,OpenThread,CreateProcess,OpenProcess,CreateMutex,OpenMutex,LoadLibrary以及可能的InitializeCriticalSection(不确定那个)。
我不知道这些是否符合您正在使用的工具中的事件句柄,但它们可能值得检查。