我已经了解到在Delphi中我必须使用try .. finally
来释放堆上的已分配对象。在java中,我从不这样做,因为它不是我的工作,而是垃圾收集器所做的事情。 delphi也没有重新计算Windows,所以我需要最后使用try。还有其他选择吗?
我是否必须使用界面或特定类来避免守卫?像
var a: ttest;
begin
a := ttest.create;
//do stuff
end;
答案 0 :(得分:9)
你可以在某些方面使用接口,但从根本上说,Delphi根本没有为Windows和OSX的旧版桌面编译器中的常规对象实现垃圾收集或引用计数这一事实(它确实使用了引用计数)适用于Android,iOS和Linux的NextGen编译器。
对所有东西使用界面是不切实际的,所以你只需要习惯自己清理。如果您创建了一个对象,请在使用完毕后将其释放。
现在,您可以提出各种聪明的模式来整理或解决,必须使用简单的try/finally
块,但这最终会导致很多工作,最终产生笨重,笨拙的代码,不符合语言风格。总是,您还将使用第三方库,组件等,所有这些通常都将以大多数Delphi代码的通用风格编写。
粗暴地强迫人工记忆管理模式除此之外还要比简单地用“Delphi方式”做更多的工作,并且会产生其他程序员难以理解和使用的代码。只是不要这样做。
智能指针是自动化生命周期管理的一种方法。可以在此处找到一个很好的示例实现:
Delphi - smart pointers and generics TList
但是这成为一种难以概括的模式,特别是对于构造函数采用各种参数列表的对象。接口或智能指针实现通常是为解决特定类型的问题而创建的工具。它们不是作为自动内存管理的粗略解决方案应用的,并且试图将它们置于这个角色中将会成为一个非常困难的时期。