Delphi自动垃圾回收器

3

未来在Delphi中实现自动垃圾回收是否可行?许多应用程序不需要高度详细的对象释放控制,这只是额外需要关注的事情。

对于这样的应用程序,拥有类似Java垃圾回收器的垃圾回收器将会很有趣。

它可以在项目选项中设置。

这是否可能?

注意:我不是像这里所解释的那样手动创建它,我真正意思是希望成为Delphi特性。

换句话说:是否可能将FastMM设置为垃圾收集器?


6
懒惰的程序员?;-) 在我看来,Delphi 不应该效仿每一门时下流行的语言。它应该制定自己的目标并朝着这个方向努力。在我看来,Delphi 不需要垃圾回收机制(GC)。此外,在我看来,能够在 GC 模式和非 GC 模式之间切换的编程语言可能会引发一个潘多拉魔盒。在调试模式下,FastMM 几乎可以收集所有应用程序退出时的垃圾并展示给你修复... :-) - user160694
5个回答

7
有许多应用程序不需要高度详细的控制何时释放对象,这只是额外需要关注的事情。
我认为几乎没有这样的应用程序。大多数情况下,您认为不需要控制对象何时被销毁,您就有可能引入错误。
现在,确实存在某些对象可以安全地忽略以便稍后由自动收集器处理。但请记住,您需要仔细思考每个您计划不手动销毁的对象。如果它持有某些锁定怎么办?如果它有一些文件处于打开状态,也许是在共享拒绝模式下?
当您需要安全编程时,从不考虑销毁每个对象并没有太大好处。垃圾回收器的目的不是使程序员摆脱这些问题。它是为了节省一些引用计数和try/finally调用。

当然可以,但是有一个垃圾回收器作为选项也不是坏事。 - UnDiUdin

6

在C和C++中可以实现垃圾回收,因此我认为Delphi也可以拥有这样的功能。如果你交叉手指等待足够长的时间,Delphi可能会得到垃圾回收。但我不认为这是Embarcadero的优先事项。

你不能设置FastMM作为垃圾回收器,因为FastMM不执行垃圾回收,所以没有什么可设置的。假设Delphi未来有垃圾回收功能,那么它可能需要与内存管理器进行合作。如果这样的功能真正存在,而FastMM仍然是内存管理器,则FastMM可能会增加一些设置。


1

垃圾回收有其优点和缺点,我认为即使没有垃圾回收器,Delphi也是一个好的选择。甚至比托管的.NET应用程序占用更少的内存空间。有时候垃圾回收也会减慢进程,因为它必须查找不需要的资源,确认是否再次需要并删除它。如果需要再次使用,则必须重新加载(应用程序变慢)或出现错误。因此,对于专业程序员来说,手动释放内存是很好的选择。


1
是的,我的第一个担忧是在Delphi中有很多需要输入的内容,例如使用"begin"代替"{",以及释放对象。当然,释放对象可以让你完全掌控并强制你更多地考虑对象的生命周期。但是,无论如何,我认为开发人员实际上只花费不到5%的时间来输入新的代码行,所以这不是一个真正的问题。 - UnDiUdin
是的,输入“begin”会浪费一点时间(而且代码自动完成很多次会替您完成),但在阅读代码时,发现“begin/end”块比“{/}”块容易得多,因此会节省大量时间。 - user160694
2
我打“begin”和“end”的速度比可怕的“{”和“}”要快得多,因为你需要用到Shift和[]键。 - The_Fox
好的,从好的方面来看,虽然需要输入更多内容,但是需要调试的内容却少了很多 :-) - Marco van de Voort

0

最新版本的Delphi带有RTTI(这也是应用程序体积庞大的原因之一)。 我认为RTTI(运行时类型信息)可以在未来帮助我们。因为它保存了一些关于正在进行的进程的信息,所以我认为未来可能会出现类似垃圾收集器的功能,但不确定。



0

但是 Delphi for .NET 2007 和其他旧版 Delphi .NET 具有垃圾回收器和 VCL,但现在已被弃用(垃圾回收器也不能完全正常工作)


1
你是在说 .NET GC 不完全有效吗?Delphi.NET 输出 CLR 代码,GC 是 .NET GC,而不是 Delphi.NET 自己的 GC。 - user160694
嘿,Delphi VCL存在一些内存泄漏问题,甚至无法被.NET的GC识别。 Delphi for .NET(D2007和旧版本)只是一个.NET包装的VCL,因此您不能期望更多的功能。 - VibeeshanRC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接