我已经在stackoverflow上找到了一些东西,但它并没有真正解决我的疑问。我知道创建对象的正确方法是在创建之后将代码包围在try-finally块中。但是怎么样:
procedure TForm3.FormCreate(Sender: TObject);
begin
a := TClassX.Create;
end;
然后致电:
procedure TForm3.FormDestroy(Sender: TObject);
begin
a.Free;
end;
a: TClassX;
是TForm3
类中的公开声明。我应该为表单创建构造函数和析构函数,还是可以使用上面的代码?这样安全吗?
答案 0 :(得分:8)
try / finally是存在的,或者至少是等价的东西。它只存在于代码之外,位于调用堆栈的上方。类似的东西:
Form1 := TForm1.Create(nil);
try
// do stuff
finally
Form1.Free;
end;
您的OnCreate
和OnDestroy
处理程序分别从构造函数和析构函数中调用,因此受到保护。
只要每个人遵守规则都没有泄漏。这里的规则是在构造函数中创建并在析构函数中销毁的对象。实际创建对象的人有责任确保无论如何都将其销毁。但这是你班级消费者的任务,而不是你。
答案 1 :(得分:0)
前段时间我遇到过这些事件的一些问题,所以我不建议在你的应用程序中使用 OnCreate / OnDestroy 事件。以下是我记得的一些案例:
默认情况下,VCL处理来自 OnCreate / OnDestroy 事件的异常。实际上,如果a:=TClassX.Create;
将生成异常,它将由应用程序异常处理程序显示,但表单将成功创建,保持" a"变量等于零。如果您稍后尝试访问此变量,则可能会导致访问冲突。
根据OldCreateOrder,可以从构造函数/析构函数或 AfterConstruction / BeforeDestruction 方法调用这些事件。如果您偶尔在表单后代中更改 OldCreateOrder ,它也可能导致访问冲突
而且,当你使用事件而不是虚函数时,我看起来很奇怪。在大多数情况下,事件用于将功能委托给其他对象(例如,您将表单的方法分配给按钮的OnClick事件)。