Delphi 如何显式释放由应用程序拥有的TForm派生类分配的GDI句柄?

Delphi 如何显式释放由应用程序拥有的TForm派生类分配的GDI句柄?,delphi,resources,c++builder,gdi,Delphi,Resources,C++builder,Gdi,从TForm派生的单个类似乎保留GDI句柄,直到应用程序关闭 class TTestForm : public TForm { public: TTestForm(TComponent*); }; std::auto_ptr<TTestForm> test(new TTestForm(NULL)); test->ShowModal(); class-TTestForm:public-TForm{ 公众: TTestForm(t组件*); }; 标准::自动ptr

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

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

std::auto_ptr<TTestForm> test(new TTestForm(NULL));
test->ShowModal();
class-TTestForm:public-TForm{
公众:
TTestForm(t组件*);
};
标准::自动ptr测试(新TTestForm(NULL));
测试->showmodel();
我是VCL的新手,所以请容忍我。此测试是使用不包含控件的窗体完成的。据我所知,如果未指定所有者,则所有对象都归应用程序所有


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

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


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

结果表明,泄漏是由错误设置的TImageList.ShareImages属性造成的。

您在哪里声明自动\u ptr?如果它在全局范围内,如上面所示,它不会超出范围,因此不会调用对象的析构函数。(当你使用NULL作为所有者时,这意味着你将管理销毁,而不是由VCL自动完成)@David:不,这只是一个简单的例子。自动ptr通常在另一个表单的成员函数中创建。我真的很想管理这场破坏。然而,当auto_ptr超出范围时,每次都会有3-4个GDI句柄泄漏。我相信我已经尝试了这两种方法,它们没有任何区别。我会再检查一遍。保持表格的有效性根本不是一个选项。你可以查看教统局的网站,看看这是否是一个已知的问题。2007年可能有一个漏洞,使用vcl方法无法绕过。还有,有没有可能表格上有东西漏了?也就是说,不是表单本身,而是其中一个控件?如果指定所有者,是否会出现相同的问题?