Delphi 7 - 何时使用 .create(Application) 以及何时使用 .create(nil)?

标签 delphi memory-management memory-leaks

我最近读了很多与此相关的内容,但从未找到最终答案。
因此,例如如果我写:

Form1 := TForm1.Create(Application);

应用程序应该负责从内存中释放表单,对吧?
为什么人们通常会这样做:

Form1 := TForm1.Create(Application);
Form1.ShowModal;
Form1.Free; 

??
在某些地方看到,如果您尝试“释放”已释放的对象,您将收到 EAccessviolation 消息,但正如我测试的那样,情况并不总是如此。

那么请问,这实际上是如何工作的?
这个 EAccessviolation 的事情快把我逼疯了,我怎样才能完全理解这个事情?我在哪里可以找到这些宝贵的信息!?

最佳答案

一般规则是:

  • 如果您要自己释放它,请使用 nil 作为所有者。
  • 如果您不打算自行释放它,请指定一个负责释放它的所有者。

所以,如果你的代码是这样的:

Form1 := TForm1.Create(...)
Form1.ShowModal;
Form1.Free;

您应该以 nil 作为所有者来编写它,并在 try..finally block 中保护它:

procedure TForm1.Button1Click(Sender: TObject);
var
  AForm: TForm2;
begin
  AForm := TForm2.Create(nil);
  try
    AForm.ShowModal;
  finally
    AForm.Free;  // You know when it will be free'd, so no owner needed
  end;
end;

另一方面,如果您要将其保留一段时间,请指定一个可以稍后释放它的所有者:

procedure TForm1.Button1Click(Sender: TObject);
var
  AForm: TForm2;
begin
  AForm := TForm2.Create(Application);
  // Here you don't know when it will be free'd, so let the
  // Application do so
  AForm.Show;
end;

如果按照我在这里演示的方式完成,这些技术都不会导致访问冲突。请注意,在这两种情况下,我都没有使用 IDE 生成的 Form2 变量,而是使用本地变量以避免混淆。这些 IDE 生成的变量是邪恶的(除了所需的 Form1 或任何您命名的代表主窗体的变量,它必须自动创建并由应用程序拥有)。除了主窗体的 var 之外,我总是立即删除该自动生成的变量,并且从不自动创建任何内容,除了可能的数据模块(可以在主窗体之前自动创建,没有任何问题,因为数据模块不能是主窗体)。

关于Delphi 7 - 何时使用 .create(Application) 以及何时使用 .create(nil)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29837776/

相关文章:

delphi - 形状分量旋转

Delphi - 查找正在从我的程序访问文件的进程

Java Crashed application - 如何读取 JVM 生成的崩溃文件?

java - Apache HttpComponents EntityUtils 内存泄漏?

delphi - 您知道 Win32 Delphi 应用程序的 MVC 框架吗?

memory-management - 在 Go 中使用 append 进行前置的机制是什么?

memory - 如何让我的服务器(用 Golang 编写)不会耗尽内存?

java - Golang 和大内存块分配

c++ - 需要一个带有 O(1) 删除的 std::vector

windows - 如何一次将多个文件传递到我注册的应用程序?