2011-04-21 79 views
6

我目前正在編寫一個node.js/socket.io應用程序,但問題通常是JavaScript。使用刪除屬性時的Javascript對象內存管理

我有一個關聯數組,爲每個客戶端連接存儲顏色。考慮以下幾點:

var clientColors = new Array(); 

//This execute each new connection 
socket.on('connection', function(client){ 
clientColors[client.sessionId] = "red"; 

    //This execute each time a client disconnect 
    client.on('disconnect', function() { 
     delete clientColors[client.sessionId]; 
    }); 
}); 

如果我使用DELETE語句,我擔心它會讓內存泄漏的後client.sessionId值(關聯數組對象)命名的屬性將不會被刪除,其引用其價值將會變得蒼白,但財產仍然存在於物體中。

對嗎?

+0

這看起來對我很好。它將刪除client.sessionId的clientColors條目。 – neebz 2011-04-21 20:16:32

回答

12

delete clientColors[client.sessionId];

這將刪除對象上的clientColors參照到對象。 v8垃圾收集器將爲垃圾收集提供引用的任何對象。

現在,如果您問是否在IE4中創建了內存泄漏,那麼這是一個不同的問題。另一方面,v8可以輕鬆應對。

看到你刪除了唯一的參考資產也將消失。還要注意,在javascript中對象不是「關聯數組」,因爲排序是特定於實現的,而不是ES規範允許的。

4

由於clientColors[client.sessionId]在這種情況下是一個原始值(字符串),它將被立即清除。

讓我們考慮更復雜的情況下foo[bar] = oo是一個非原始(某些對象)。理解o不是存儲在foo的「內部」,而是存儲在任意內存位置的某處非常重要。 foo只保存一個指向該位置的指針。當你致電delete foo[bar]時,該指針被清除,並且由垃圾回收器來釋放o所佔用的內存。

順便說一句:當你想要一個關聯數組時,你不應該使用Array。後者在Javascript中被稱爲Object,並且通常使用短文準文字實例化{}

-1

如果您使用的是V8引擎或nodejs/io,它可能不會導致泄漏,但始終建議您泄漏。

只需把它刪掉

delete clientColors[client.sessionId]; 

或將其設置爲null

clientColors[client.sessionId] = null; 

這也將級聯到任何prototypically繼承的對象。

這種方式幾乎沒有發生泄漏的可能性。

+2

我假設你的意思是在將數組元素分配給null之前刪除,否則你不會刪除任何東西,因爲'clientColors [client.sessionId]'引用將爲空。還是我誤解你的意圖呢? – 2016-08-16 16:18:43