这个问题在这里已有答案:
在像C#
这样的语言中,这不是问题,但这会在其他语言中难以找到内存错误。我可以在Typescript
或Javascript
中使用以下代码并相信一切都会好吗?
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?
TypeScript没有运行时。
有许多JavaScript运行时,所以不可能说所有这些都是特定的事情,但所有主要的运行时(在流行的浏览器中发布的那些,node.js)都能够轻松处理断开连接的循环引用。
在JS中有一个定义明确的内存根,从中可以很容易地进行标记和扫描GC,这对于处理循环引用没有任何问题。循环引用实际上只是引用计数GC系统中的一个问题,并且没有很好的理由在JS语言中进行引用计数,因为您不需要确定性清理。