我已经在堆叠溢出中找到了一些东西,但它并没有真正解决我的疑虑。我知道创建对象的正确方法是,在创建之后,将代码包围在一个try- code块中。但是,关于:
procedure TForm3.FormCreate(Sender: TObject);
begin
a := TClassX.Create;
end;然后打电话:
procedure TForm3.FormDestroy(Sender: TObject);
begin
a.Free;
end;其中a: TClassX;是TForm3类中的公共声明。我应该为表单创建构造函数和析构函数,还是可以使用上面的代码?安全吗?
发布于 2016-09-17 16:28:51
尝试/最终在那里,或者至少有类似的东西。它只存在于您的代码之外,在调用堆栈的更高的位置。类似于:
Form1 := TForm1.Create(nil);
try
// do stuff
finally
Form1.Free;
end;您的OnCreate和OnDestroy处理程序分别从构造函数和析构函数中调用,因此受到保护。
只要每个人都遵守规则,任何事情都不会泄露。这里的规则是在构造函数中创建并在析构函数中销毁的对象。不管是谁实际创造了这个物体,他都有责任确保它无论如何都被摧毁。但这是你这个阶层的消费者的任务,而不是你。
发布于 2016-09-21 02:55:24
不久前,我对这个事件有一些问题,所以我不建议在您的应用程序中使用OnCreate/OnDestroy事件。以下是一些我记得的案例:
a:=TClassX.Create;将生成一个异常,它将由应用程序异常处理程序显示,但该表单将成功地保持“一个”变量等于零。如果以后尝试访问此变量,这可能会导致访问冲突。更重要的是,当您使用事件而不是虚拟函数时,我觉得很奇怪。在大多数情况下,事件用于将功能委托给其他对象(例如,将表单的方法分配给按钮的OnClick事件)。
https://stackoverflow.com/questions/39548434
复制相似问题