德尔福内存管理

Los*_*311 4 delphi pascal memory-management

我无法找到几个Delphi内存管理问题的答案.我可以测试不同的场景(我做了什么来找出破坏FreeAndNil方法的东西),但它需要太长时间而且很难!但说真的,我还想知道你们(Delphi开发人员)如何处理这些内存管理问题.

我的问题(随意提出自己的问题,我确信他们的答案对我也有帮助):

  1. FreeAndNil是否适用于COM对象?我的想法是我不需要它,但是如果我需要做的就是将它设置为nil,而不是为什么不在我的finally块中保持一致并使用FreeAndNil来做所有事情?

  2. 什么是清理静态数组的正确方法(myArr:TObject的数组[0..5]).我不能FreeAndNil它,所以将它设置为nil是否足够好(在FreeAnNil'd每个对象之后我需要这样做吗?)?

多谢你们!

Mas*_*ler 8

COM对象通过接口引用,您无需执行任何操作即可.编译器负责必要的引用计数逻辑,以确保在正确的时间处理COM对象.

至于静态数组(或动态数组),它们也不需要被释放.如果它们包含对象,则必须在适当的时间释放对象,但数组不会.

此外,永远不要在任何不是对象引用的东西上使用FreeAndNil.将它与接口或其他变量一起使用可能会破坏内存.最好永远不要使用它(使用Free代替),除非你正在处理一个你需要释放然后再重用的对象.

  • 有人应该写一篇名为"FreeAndNil被认为有害"的文章:) (4认同)
  • 是的,有些人喜欢它,但IME实际上更好地使用它作为*尽可能小*. (3认同)
  • 像"最好永远不要使用它"之类的声明需要有理由.这是一个非常有争议的声明,请参阅Bauer博客文章的评论以获取证据.提问者似乎在Delphi的基本内存管理问题上存在问题,给了他一个盲目跟随的规则而不理解它背后的基本原理无济于事. (2认同)