【问题标题】:Managing memory with form creation in C++ Builder / Firemonkey在 C++ Builder / Firemonkey 中通过创建表单来管理内存
【发布时间】:2016-06-22 17:00:26
【问题描述】:

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

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 的三个实例仍保留在内存中。

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

【问题讨论】:

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


    【解决方案1】:

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

    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
      Action = TCloseAction::caFree;
    }
    

    Form 将在关闭时自行释放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2013-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      相关资源
      最近更新 更多