6

我目前正在编写一个 node.js/socket.io 应用程序,但这个问题对于 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值命名的属性(关联数组是对象)不会被删除,它对其值的引用将会消失,但该属性仍然存在于目的。

我对吗?

4

3 回答 3

12

delete clientColors[client.sessionId];

这将删除对 object 对象的引用clientColors。v8 垃圾收集器将拾取任何具有引用的对象进行垃圾收集。

现在,如果您问这是否在 IE4 中造成了内存泄漏,那么这是一个不同的问题。另一方面,v8 可以轻松处理这个问题。

看到您删除了唯一的引用,该属性也将消失。另请注意,对象不是 javascript 中的“关联数组”,因为排序是特定于实现的,并且不受 ES 规范的保证。

于 2011-04-21T20:14:24.620 回答
4

由于clientColors[client.sessionId]在这种情况下是原始值(字符串),它将立即被清除。

让我们考虑更复杂的情况,即foo[bar] = o作为o非原始(某个对象)。重要的是要了解它o不是存储在“内部” foo,而是存储在任意内存位置的某个地方。foo仅保存指向该位置的指针。当您调用 时delete foo[bar],该指针被清除,由垃圾收集器来释放o.

Array顺便说一句:当你想要一个关联数组时,你不应该使用。后者Object在 Javascript 中调用,通常使用简写的 quasi-literal 实例化{}

于 2011-04-21T22:02:46.207 回答
-1

如果您使用 V8 引擎或 nodejs/io,它可能不会导致泄漏,但始终建议防止泄漏。

删掉就好

delete clientColors[client.sessionId];

或者设置为空

clientColors[client.sessionId] = null;

这也将级联到任何原型继承的对象。

这种方式几乎没有开始泄漏的可能性。

于 2015-07-21T11:21:44.363 回答