2010-06-24 42 views
14

在這個例子中動態數組超出範圍時會自動釋放嗎?

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

回答

14

內存被釋放。 (也就是說,沒有內存泄漏!)

+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

1

該數組被自動釋放,但我已經看到了不明原因的情況。我通過將數組設置爲零來解決它。

+6

爲什麼它不會被釋放只有兩個原因。要麼你用可能會引起引用計數的指針來做一些可怕的事情,要麼就是數組是由一個對象或記錄所擁有,這些對象或記錄也在泄漏。 – 2010-06-24 20:06:21

+0

我知道,不知何故還有別的東西導致它不能自動釋放。我希望我仍然有這樣的例子來證明它!但我不知道。 – 2010-06-25 03:59:42

+0

這將是編譯器代碼中的一個錯誤。或者,也許它是一個threadvar?該幫助明確指出,用作threadvars的託管類型不會自動釋放自己,您需要手動執行此操作。 – 2010-06-25 12:41:22