C++ 是否有可能找出GDI对象泄漏的原因

C++ 是否有可能找出GDI对象泄漏的原因,c++,c++builder,gdi,C++,C++builder,Gdi,我在Embarcadera RAD Studio 2010(C++)中有一个应用程序。有没有可能窥视一下它,看看哪些GDI对象会泄漏?当文本设置为Bold时,树结构菜单正在泄漏GDI对象。我的猜测是,“原始”文本首先被创建,然后以粗体显示,第一个文本被“遗忘”并泄漏 编辑:由于在AQTime中没有报告泄漏,即使通过查看Taskmanager是obvoius,我跟踪了正在创建而不是释放GDI对象的代码片段 ... Msg.WParam=(int)PhysicalListView->Canv

我在Embarcadera RAD Studio 2010(C++)中有一个应用程序。有没有可能窥视一下它,看看哪些GDI对象会泄漏?当文本设置为Bold时,树结构菜单正在泄漏GDI对象。我的猜测是,“原始”文本首先被创建,然后以粗体显示,第一个文本被“遗忘”并泄漏

编辑:由于在AQTime中没有报告泄漏,即使通过查看Taskmanager是obvoius,我跟踪了正在创建而不是释放GDI对象的代码片段

...

Msg.WParam=(int)PhysicalListView->Canvas->Handle;
PhysicalListView->Dispatch(&Msg);

... 
PhysicalListView是指向TListView的指针。据我所知,以T开头的类是标准Embarcadero类的一部分(正确吗?)

当我在listview中选择了一个包含未修饰文本的子节点时,一切正常。但是,当一个或多个孩子有粗体或下划线文本时,例如,GDI计数在调度调用后不会减少

所以我猜这是TListView类中的一个错误。我不知道这是否对WinForms有效,或者它是否使用自己的解决方案

此外,这在调试模式下发生。我将在编译发布版本时检查问题是否消失。如果是,则表示调试版本的TListView中存在泄漏

EDIT2:我想我已经发现了这个问题。发送的初始消息包括一个WM_PAINT,阅读此消息后,此消息不应由客户端应用程序发送,而是由系统使用。所以我把它改成了WM_打印,泄漏消失了。我不知道为什么要使用WM_PAINT,我发现它缺少一些功能。。。你知道他们为什么会使用WM_PAINT吗?

你试过了吗


时间是我选择的工具。它是一个分析器,提供了比GDI泄漏检测更多的功能。RAD Studio XE附带AQTime的标准版本。对于专业版,您需要支付更多的费用。

是我们在工作中使用的一种工具,它可以处理所有类型的内存泄漏,包括gdi对象。

请在此处阅读:尝试一下,看看我似乎找不到它。似乎没有安装。在“合作伙伴ISO”上检查,但也没有任何内容。。。hmmmmI安装了试用版,但我没有让它列出任何GDI信息:)。。。我选择了“Resource Profiler”并选择了“GDI”和“GDI+”,但我只得到了一个空报告,除了
user32.dll
中的som错误,“user32.dll 1411 getClassInfo类不存在”。@inquam:IIRC默认情况下它是在没有合作伙伴ISO的情况下安装的(但正如我所写的,这是XE)。“资源探查器”是正确的,但是您还需要确保您正在采样。否则它将解释为什么没有输出。很难猜测到底是什么错了。但是我在不同的Windows版本上使用AQTime取得了很好的效果。对于unixoid系统,Valgrind通常会发现漏洞。我已经这样设置了它:但是我没有看到任何关于GDI的漏洞。但是我可以在taskmanager中看到它显然是在疯狂地泄漏。@inquam:所以你从头到尾(退出)运行程序,没有发现泄漏?嗯,这通常意味着没有。不过,任务管理器并不是查明泄漏的可靠手段。