我试图了解一个重要对象在哪里得到他的析构函数。 我做了一个明确的,以便记录导致它的堆栈跟踪。
但是new StackFrame(1).GetMethod().Name;
会抛出一个NullReferenceException
,我不确定我是否可以使用该方法,因为析构函数(~MyClass(){}
)没有被应用程序明确调用(无论如何,我认为你不能)。
有没有办法知道导致物体毁坏的堆栈跟踪?
谢谢!
答案 0 :(得分:4)
你的问题毫无意义 托管对象永远不会被明确破坏。
相反,垃圾收集器将在最后一次引用它之后的某个时间收集每个对象 如果对象具有终结器,则GC将在GC线程上运行它,然后再收集对象。
答案 1 :(得分:3)
终结器(这是你正在编写的,它们不是析构函数,即使它们可能使用与C ++中的析构函数相同的语法)也会在垃圾收集器拥有的线程上调用。堆栈跟踪中没有任何内容与您相关,即使您可以获得它。
通常无法知道哪些事件会导致对象的破坏,因为对象破坏在.NET中是不确定的。 GC偶尔会检查哪些对象仍然可以访问。任何无法访问的对象都会释放其内存。无处跟踪对象的最后一次实时引用是什么。