2010-01-22 69 views
3

我有一個對象數組。如果我調用unset($ array),它會取消設置數組中的所有對象和數組還是數組?我們假設這些對象在其他地方被引用。是否取消設置一個對象數組,只取消數組或所有對象?

+0

讓我們假設你嘗試過。發生了什麼? – GZipp 2010-01-22 18:02:43

+0

那麼,當我調用unset()之後print_r($ array)時,什麼也不打印。所以我不確定只是數組或者數組和它包含的對象是否被釋放。 – 2010-01-22 18:35:14

回答

2

如果該數組包含對該對象的唯一引用,那麼是的。否則不。另外,請注意PHP文檔中的一些事項:

unset()做的就是它的名稱 - 取消設置變量。它不強制立即釋放內存。 PHP的 垃圾收集器會做它時,它 看到千篇一律 - 儘快意向,作爲 反正不需要的CPU週期, 或遲腳本之前將 耗盡內存,無論發生什麼, 第一。

0

它看起來像內存不會釋放,直到您的腳本完成執行。 http://bugs.php.net/bug.php?id=48368

+0

由於您沒有指定您使用的版本,所以我應該注意,由於垃圾收集器的引入,如果您處於版本5.3或更高版本,其他答案會更合適。但是,如果沒有GC,您的對象將保留在內存中,直到腳本執行完畢。 – 2010-01-22 19:02:10

+0

我正在使用5.2.6。 – 2010-01-22 19:40:43

1

GSto是正確的...只有PHP garbadge收集器可以釋放內存。 unset()一個變量或將其設置爲NULL可以加速「garbadge收集」過程(以CPU週期爲代價),但無法直接釋放某些內存(在「刪除」實際上釋放內存的情況下, 。

我問過類似的問題,前一段時間在一個論壇上,這是我得到了什麼:

從缶廬@ codingforums.com:

取消設置自由是它的資源,並且沒有任何 請求也是如此(例如 mysql_free_result)。是的,這允許 收集器照顧它。但是 直到收集過程發生, 它將忽略任何引用的 變量。所以,如果gc 的通過發現引用了一個變量,那麼它 將忽略它。如果它看到它已經被釋放了,它會佔用它,但是如果你有一塊不是 的數據塊,它將被釋放並且不會被使用,它會在內存中坐在 內,直到腳本終止爲止(少於 相關時下現代高ram systems)。對於gc來說,使用未設置的數組是 。我會 看看我是否能在源找到它, 但我會假定所有包含HashMap 使用的C基準指針和 沒有價值,所以值本身 任何意義的,因爲沒有一個空指針 是無論如何,尺寸相同。我倒是 還懷疑,一旦GC到達 HashMap中,它會經過 並釋放與 它相關的所有的zval並履行寫上副本 與 一個特定變量(花式相關的任何個人指針 表示不會發布任何索引 ,這是由另一個 變量引用的)。

http://www.codingforums.com/showthread.php?t=184164