【问题标题】:How to explicitly release GDI handles allocated by TForm derived class owned by the Application?如何显式释放应用程序拥有的 TForm 派生类分配的 GDI 句柄?
【发布时间】:2011-03-07 13:31:42
【问题描述】:

从 TForm 派生的单个类似乎会保留 GDI 句柄,直到应用程序关闭。

class TTestForm : public TForm {
  public:
    TTestForm(TComponent*);
};

std::auto_ptr<TTestForm> test(new TTestForm(NULL));
test->ShowModal();

我对 VCL 很陌生,所以请多多包涵。此测试是使用不包含控件的表单完成的。据我所知,如果没有指定所有者,所有对象都归应用程序所有。

我的应用程序动态创建(和销毁)许多表单。每次显示窗体时分配 3-4 个新的 GDI 句柄。有没有办法在应用程序生命周期内显式释放这些 GDI 句柄?

【问题讨论】:

  • 你在哪里声明 auto_ptr?如果它在全局范围内,如上所示,它不会超出范围,因此不会调用对象的析构函数。 (当你使用NULL作为Owner时,意味着你将管理销毁,它不会由VCL自动完成)
  • @David:不,这只是一个简化的例子。 auto_ptr 通常在另一个表单的成员函数中创建。我确实想管理破坏。但是,当 auto_ptr 超出范围时,每次似乎都会泄漏 3-4 个 GDI 句柄。

标签: delphi resources c++builder gdi


【解决方案1】:

警告:我是 Delphi 程序员,不是 C++,但 VCL 基本上就是 VCL。您可以尝试使用表单的 Release() 方法而不是 free()。或者,在 OnClose 事件中设置传递给 caFree 的 Action 参数 - 这应该告诉 VCL 在窗体关闭时释放窗口的资源,而不是隐藏它。

我想另一个问题是 - 你需要继续创建/销毁表单吗?您可以创建一次然后重复使用它们吗?

【讨论】:

  • 我相信我已经尝试了这两种选择,但它们没有任何区别。我会再次检查。让表单保持活动状态根本不是一种选择。
  • 您可以查看 Emb 的网站,看看这是否是已知问题。 2007 年可能存在泄漏,使用 vcl 方法无法解决。另外,表格上是否有可能泄漏的东西?即,它不是表单本身,而是控件之一?如果指定所有者,是否也会出现同样的问题?
【解决方案2】:

事实证明,泄漏是由错误设置的 TImageList.ShareImages 属性引起的。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多