c++ - 在 C++ Builder/Firemonkey 中使用表单创建管理内存

标签 c++ forms c++builder firemonkey c++builder-xe8

到目前为止,在我的应用程序中,所有在运行时创建的附加表单都应该是模态的。因此,在创建新表单时,我使用类似于以下代码块的内容:

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;
}

表单在关闭时将自行释放。

关于c++ - 在 C++ Builder/Firemonkey 中使用表单创建管理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35872631/

相关文章:

c++ - 无法让 Windows 覆盖图标在 TListView 中工作

python - python中的函数签名

C++ STL 映射异常。 (不可变树的根)

c++ - 将 gzstream 与压缩文件一起使用时如何保持流位置?

javascript - 即使 Angular JS 中的必填字段留空,表单也会被提交

javascript - 使用日期选择器填充日期下拉列表

javascript - 无法取消 jquery 中的表单提交

delphi - TIdTCPServer 如何在 60Hz 计时器中向所有客户端多播?

c++ - 全局变量构造函数/析构函数是否需要线程保护?

c++ - C & C++ 中数组的动态内存分配