使用C++ Builder/Firemonkey中的表单创建来管理内存

Jam*_*gle 2 c++ forms c++builder firemonkey c++builder-xe8

到目前为止,在我的应用程序中,它已经确定在运行时创建的所有其他表单应该是模态的.因此,在创建新表单时,我使用类似以下代码块的东西:

void __fastcall ShowForm( TComponent * Owner )
{
    TForm1 * form = new TForm1( Owner );
    form->ShowModal();

    delete form;
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法,表单的内存在用户关闭后很容易删除.

但是,在尝试弄清楚如何处理非模态对话框的内存管理时,我遇到了一个问题.显然,我不能简单地在ShowForm方法结束时调用delete,因为表单会在创建后立即删除.所以我留下这样的东西:

void __fastcall ShowForm( TComponent * Owner )
{
    TForm1 * form = new TForm1( Owner );
    form->Show();
}
Run Code Online (Sandbox Code Playgroud)

基于此文档和我编写的测试应用程序,我知道form指针将在其所有者关闭后被删除.但是,这仍然让我有以下情况:

假设我有FormA一个按钮,它创建并显示FormB使用代码的实例,就像上面的方法一样.我现在单击按钮创建一个FormB然后关闭FormB,三次.直到FormA关闭,三个实例FormB仍留在内存中.

如何管理表单创建的内存,以便在表单关闭后删除为表单分配的内存?是否有标准的最佳实践,或者我缺少的内置功能?

Ken*_*ite 5

使用TForm :: FormClose事件,并将Action参数设置为caFree:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  Action = TCloseAction::caFree;
}
Run Code Online (Sandbox Code Playgroud)

表格将在关闭时自由释放.