在 C++ Builder / Firemonkey 中通过创建表单来管理内存
Managing memory with form creation in C++ Builder / Firemonkey
到目前为止,在我的应用程序中,所有在运行时创建的附加表单都应该是模态的。因此,在创建新表单时,我使用类似于以下代码块的内容:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->ShowModal();
delete form;
}
使用这种方法,表单的内存在用户关闭后很容易被删除。
但是,当我试图弄清楚如何处理非模态对话框的内存管理时,我 运行 遇到了一个问题。显然,我不能简单地在 ShowForm
方法的末尾调用 delete,因为表单会在创建后立即被删除。所以我留下了这样的东西:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->Show();
}
根据 this documentation 和我编写的测试应用程序,我知道 form
指针将在其所有者关闭后被删除。然而,这仍然给我留下了以下场景:
假设我有一个带有按钮的 FormA
,该按钮使用与上述方法相同的代码创建并显示 FormB
的实例。我现在单击按钮创建 FormB
然后关闭 FormB
,三次。在 FormA
关闭之前,FormB
的三个实例仍保留在内存中。
如何管理用于创建表单的内存,以便在表单关闭后删除为该表单分配的内存?是否有这方面的标准最佳实践,或者我缺少的内置功能?
使用TForm::FormClose事件,并将Action
参数设置为caFree
:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = TCloseAction::caFree;
}
窗体在关闭时将自行释放。
到目前为止,在我的应用程序中,所有在运行时创建的附加表单都应该是模态的。因此,在创建新表单时,我使用类似于以下代码块的内容:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->ShowModal();
delete form;
}
使用这种方法,表单的内存在用户关闭后很容易被删除。
但是,当我试图弄清楚如何处理非模态对话框的内存管理时,我 运行 遇到了一个问题。显然,我不能简单地在 ShowForm
方法的末尾调用 delete,因为表单会在创建后立即被删除。所以我留下了这样的东西:
void __fastcall ShowForm( TComponent * Owner )
{
TForm1 * form = new TForm1( Owner );
form->Show();
}
根据 this documentation 和我编写的测试应用程序,我知道 form
指针将在其所有者关闭后被删除。然而,这仍然给我留下了以下场景:
假设我有一个带有按钮的 FormA
,该按钮使用与上述方法相同的代码创建并显示 FormB
的实例。我现在单击按钮创建 FormB
然后关闭 FormB
,三次。在 FormA
关闭之前,FormB
的三个实例仍保留在内存中。
如何管理用于创建表单的内存,以便在表单关闭后删除为该表单分配的内存?是否有这方面的标准最佳实践,或者我缺少的内置功能?
使用TForm::FormClose事件,并将Action
参数设置为caFree
:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = TCloseAction::caFree;
}
窗体在关闭时将自行释放。