到目前为止,在我的应用程序中,已经确定在运行时创建的所有其他表单都应该是模态的。因此,在创建新表单时,我使用类似以下代码块的东西:
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
的三个实例仍保留在内存中。
如何管理表单创建的内存,以便在表单关闭后删除为表单分配的内存?是否有标准的最佳实践,或者我缺少的内置功能?
答案 0 :(得分:5)
使用TForm::FormClose事件,并将Action
参数设置为caFree
:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = TCloseAction::caFree;
}
表格将在关闭时自行解除。