gpt4 book ai didi

c# - 为什么垃圾收集器以错误的顺序接收对象?

转载 作者:太空狗 更新时间:2023-10-29 20:43:24 26 4
gpt4 key购买 nike

我有一个包含两个类 A 和 B 的应用程序。类 A 内部有对类 B 的引用。类的析构函数对资源进行了一些清理,但必须以正确的顺序调用它们,首先是析构函数A 的析构函数,然后是 B 的析构函数。

发生的事情是以某种方式首先调用 B 的析构函数,然后 A 的析构函数崩溃,因为它试图从已处置的对象中执行方法。

GC 的这种行为是否正确?我希望 GC 检测到 A 具有对 B 的引用,然后首先调用 A 的析构函数。我说得对吗?

谢谢伙伴们!

PD:如果对析构函数/终结器/处置器等有疑问,这就是我们所拥有的:

~A()
{
this.Dispose();
}

~B()
{
this.Dispose();
}

最佳答案

正如其他人所指出的,您的终结器是错误的,错误的,错误的。您不能简单地在终结器中调用 Dispose 并期望好事发生。阅读实现一次性模式的正确方法。

做对是您必须完成的工作的开始,而不是结束。除了此处的所有其他正确答案外,我还注意到:

  • 终结器可以(而且通常确实)在不同的线程上运行。终结与特定线程有关联的资源是危险的,如果不小心,可能会遇到死锁,等等。

  • 终结可以通过将对死对象的引用分配给活对象中的变量来“复活”死对象。不要那样做。这令人难以置信。

  • 终结器可以在发生线程中止异常时部分构造的对象上运行。您不能假设任何适用于完全构建对象的不变量也适用于正在完成的对象。

由于所有这些原因,正确编写终结器非常困难。避免,避免,避免。

关于c# - 为什么垃圾收集器以错误的顺序接收对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163603/

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