Delphi 德尔福;“免费”;TStringDynArray

Delphi 德尔福;“免费”;TStringDynArray,delphi,Delphi,在创建TStringDynArray(例如通过SplitString)时是否不需要释放TStringDynArray?释放它的尝试失败了,因为它不是对象 当我在后台进程中使用它时,我担心在没有明确释放内存的情况下使用它会造成内存泄漏。否,a由编译器管理。它是引用计数的,当引用计数降至零时将被释放 (但是,如果数组的元素是(指向)对象,则不会自动释放这些对象。只会释放数组本身。在您的情况下,元素是字符串,并且它们也由编译器管理。) 但是您可能偶尔希望在变量超出范围之前释放内存。例如,如果您有一个全

在创建TStringDynArray(例如通过SplitString)时是否不需要释放TStringDynArray?释放它的尝试失败了,因为它不是对象

当我在后台进程中使用它时,我担心在没有明确释放内存的情况下使用它会造成内存泄漏。

否,a由编译器管理。它是引用计数的,当引用计数降至零时将被释放

(但是,如果数组的元素是(指向)对象,则不会自动释放这些对象。只会释放数组本身。在您的情况下,元素是字符串,并且它们也由编译器管理。)


但是您可能偶尔希望在变量超出范围之前释放内存。例如,如果您有一个全局变量,它是一个巨大的动态数组,那么您可以显式地执行
SetLength(MyArray,0)
MyArray:=nil
Finalize(MyArray)
来放弃它。

太好了,谢谢您的回答。因为我只使用字符串,所以我应该出于安全考虑@MichaSchumann注意到,即使元素是指向对象的指针,也不一定意味着在处理数组时需要释放这些对象。这在很大程度上取决于它们是如何创建/管理的。也许还有另一个更合适的地方可以销毁它们,比如这些对象位于多个列表/数组中,或者在其他地方引用,比如表单上的控件(在这种情况下,您不应该尝试释放它们)。谢谢。对于对象,我通常使用泛型中的伟大TObjectList,这有助于避免内存泄漏。有时我对Java和垃圾收集有点老生常谈,尤其是当一个项目有严格的时间限制时;-)@MichaSchumann:我同意。通用对象列表很棒,我也使用了很多。还有一个通用对象字典。@Andreas是的,这个我也用了很多。若和Delphi7时代的代码相比,事情变得很简单。。。