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

问题描述 投票:1回答:1

这个问题在这里已有答案:

在像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?

javascript node.js typescript siblings circular-reference
1个回答
7
投票

TypeScript没有运行时。

有许多JavaScript运行时,所以不可能说所有这些都是特定的事情,但所有主要的运行时(在流行的浏览器中发布的那些,node.js)都能够轻松处理断开连接的循环引用。

在JS中有一个定义明确的内存根,从中可以很容易地进行标记和扫描GC,这对于处理循环引用没有任何问题。循环引用实际上只是引用计数GC系统中的一个问题,并且没有很好的理由在JS语言中进行引用计数,因为您不需要确定性清理。

© www.soinside.com 2019 - 2024. All rights reserved.