gpt4 book ai didi

c# - 同一类的析构函数中的对象实例化和垃圾收集

转载 作者:行者123 更新时间:2023-11-30 00:40:16 37 4
gpt4 key购买 nike

最近,在学习面向对象编程的入门单元时,我了解到 C# 中的垃圾收集器,它的作用是“清理”不再被引用的对象。然后向我介绍了析构函数,以及在删除对象之前如何调用析构函数。

我自然而然地想到了,但我一直不记得问过讲师;如果在同一个类的析构函数中创建一个类的实例会发生什么?

C# 示例

class Person{
~Person(){

Person p = new Person();
Console.WriteLine("Person destroyed");

}
}

class Program{
static void Main(string[] args){
Person p = new Person();
}
}

我想从更理论的角度来解决这个问题,所以我(在这个阶段)不愿意尝试,因为我可能无论如何都不会理解,但我有一些理论。此外,我现在不在我的常用计算机旁 ;)

  • Person.~Person() 将递归,因为每次创建新的 Person 时,它将调用其析构函数并无限创建一个新的 Person,或者直到发生某种与内存相关的异常。随后,main 将永远不会终止。
  • 编译器会提示(无论如何,将此选项添加到每个场景似乎都是个好主意)。
  • 不知何故,会发生某种“跳过析构函数”。 IE。对象销毁不会按顺序调用,因此构造函数也不会。

现在回答一个类似的相关问题。如果垃圾收集器的作用是删除不再被引用/不需要的对象,那么在没有垃圾收集器的环境(比如 C++)中如何处理上述情况?

最佳答案

我认为这里没有真正的神秘。

它不会像这样“递归”——你只是在托管堆上丢弃一个新对象,它会立即被取消引用;从而使其成为垃圾收集的候选对象。

最终垃圾收集器会再次出现,再次触发操作等。

那不是递归——更像是一个链。但最终每个 Person 都会从内存中删除。

并且,过了一会儿,垃圾收集器会向您发送一封电子邮件,提示您不公平。

至于 C++,我的猜测是堆栈溢出,因为构建/破坏在那里发生,然后是一台非常闷闷不乐的计算机。

如果您的下一个合乎逻辑的想法是“运行时/语言不应该阻止这种情况发生吗?” - 不。有问题的语言或运行时不会阻止你做一些否则会被认为是不明智的事情;它信任你,程序员,确保你不会那样做。

也就是说 - 在应用程序关闭场景中(关于您在下面的评论),.Net 运行时将出于自身利益采取行动,最终将停止处理这些终结器以执行关闭。终结器是为了您的利益,而不是运行时的利益。

关于c# - 同一类的析构函数中的对象实例化和垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6422405/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com