在类似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?
答案 0 :(得分:7)
TypeScript没有运行时。
JavaScript运行时很多,因此不可能说其中的所有特定情况都是正确的,但是所有主要运行时(流行浏览器中附带的所有运行时,node.js)都可以轻松实现处理断开的循环引用。
JS中有一个定义明确的内存根,通过它可以很容易地进行标记扫掠GC,在处理循环引用时没有问题。循环引用实际上只是引用计数的GC系统中的一个问题,并且由于不需要确定性清除,因此没有必要使用JS语言进行引用计数。