动态数组超出范围时会自动释放吗?

问题描述:

在这个例子中动态数组超出范围时会自动释放吗?

procedure foobar; 
var tab:array of integer; 
begin 
    setlength(tab,10); 
end; 

是破坏了阵列或存储器泄漏?

+0

虽然它可能不会泄漏,但您确实应该释放自己的变量。 执行SetLength(tab,0);这是一个额外的线。 如果你担心它,然后将其包装在try/finally块中。 – 2010-06-25 02:42:55

+2

我不能赞同@瑞恩的建议。你是否也手动清除了所有的字符串变量?当我看到代码将值赋给不再使用的变量时,它告诉我程序员并不真正了解该语言是如何工作的。特别是,编译器已经在函数体中放置了一个try-finally块,以确保动态数组变量得到清理。投入你自己的一个是矫枉过正。 – 2010-06-25 12:29:37

+0

@瑞恩,这是错的。对SetLength的调用完全是浪费,在运行时都是键击和不必要的函数调用。动态数组由编译器管理,并在超出作用域时自动释放。 – 2010-06-25 13:09:16

内存被释放。 (也就是说,没有内存泄漏!)

+4

如果元素也由编译器管理(dyn数组,字符串,intf,具有这种类型的记录等),也会释放元素。 – alex 2010-06-24 20:53:39

+1

对于“tab:Integer数组”,一切都被释放。对于“tab:TObject数组”或任何其他类,您必须自己释放对象。 – 2010-06-25 13:57:37

+0

没错,@Warren,但这与阵列无关。同样的建议适用于普通的标量。对象需要被释放;整数不。 – 2010-06-25 16:34:33

该数组被自动释放,但我已经看到了不明原因的情况。我通过将数组设置为零来解决它。

+6

为什么它不会被释放只有两个原因。要么你用可能会引起引用计数的指针来做一些可怕的事情,要么就是数组是由一个对象或记录所拥有,这些对象或记录也在泄漏。 – 2010-06-24 20:06:21

+0

我知道,不知何故还有别的东西导致它不能自动释放。我希望我仍然有这样的例子来证明它!但我不知道。 – 2010-06-25 03:59:42

+0

这将是编译器代码中的一个错误。或者,也许它是一个threadvar?该帮助明确指出,用作threadvars的托管类型不会自动释放自己,您需要手动执行此操作。 – 2010-06-25 12:41:22