是否有可能找出泄漏GDI对象的内容

时间:2011-05-30 09:16:30

标签: c++ c++builder gdi

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

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

...

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

... 

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

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

所以我的猜测是 TListView 类中的错误。我不知道这是否适用于WinForms或它是否使用它自己的解决方案?

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

编辑2:我想我已经发现了这个问题。发送的初始消息包括 WM_PAINT ,在阅读之后,此消息不应由客户端应用程序发送,而是由系统使用。所以我将其更改为 WM_PRINT ,泄漏消失了。我不知道为什么使用了 WM_PAINT ,或许我错过了它的一些功能......为什么他们会使用 WM_PAINT

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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