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