Typescript / Javascript垃圾收集器会处理循环引用还是会泄漏内存?

时间:2019-03-13 20:34:05

标签: javascript node.js typescript siblings circular-reference

在类似C#的语言中,这不是问题,但这会导致很难找到其他语言的内存错误。我可以在TypescriptJavascript中使用以下代码,并相信一切都会好吗?

class Dad {
    kids: Kid[];
}
class Kid {
    dad: Dad;
    siblings: Kid[];
}

let anakin: Dad | undefined;

function makeKids(dad: Dad) {
    const luke = new Kid();
    const leia = new Kid();
    luke.dad = dad;
    leia.dad = dad;
    luke.siblings = [leia];
    leia.siblings = [luke];
    dad.kids = [luke, leia];
}

anakin = new Dad();
makeKids(anakin);
console.log(anakin.kids.length); // Prints out 2
anakin = undefined;
// I expect luke and leia to die at this point
// Not float around the memory space infinitely

还是我应该使孩子和兄弟姐妹变量为可选,并添加一个destructor?像这样:

kids?: Kid[];
siblings?: Kid[];
destructor() {
    this.kids = undefined
}

这是一个相关主题,我对答案不满意:Destroy an circular-reference instance in typescript?

1 个答案:

答案 0 :(得分:7)

TypeScript没有运行时。

JavaScript运行时很多,因此不可能说其中的所有特定情况都是正确的,但是所有主要运行时(流行浏览器中附带的所有运行时,node.js)都可以轻松实现处理断开的循环引用。

JS中有一个定义明确的内存根,通过它可以很容易地进行标记扫掠GC,在处理循环引用时没有问题。循环引用实际上只是引用计数的GC系统中的一个问题,并且由于不需要确定性清除,因此没有必要使用JS语言进行引用计数。