2011-07-27 41 views
0

我想了解一个重要的对象在哪里被调用的析构函数。 我做了一个明确的,以便记录导致它的堆栈跟踪。如何知道谁毁坏了一个物体?

new StackFrame(1).GetMethod().Name;抛出一个NullReferenceException,我不知道我可以使用的方法,因为析构函数(~MyClass(){})没有明确地定义应用程序调用(反正我觉得你不能)。

有没有什么办法知道堆栈跟踪导致对象的破坏?

谢谢!

+2

析构函数将只会被终结器线程调用 - 并且只有一次对该对象的所有引用都消失了。你得到的答案将永远是相同的(“哦,它是终结者线程”) –

回答

3

在垃圾收集器拥有的线程上调用终结器(这就是您正在编写的内容,它们不是析构函数,即使它们可能使用与C++中的析构函数相同的语法)。即使您可以得到它,堆栈跟踪中也没有任何与您相关的内容。

一般来说,没有办法知道哪些事件导致对象被破坏,因为在.NET中对象的破坏是非确定性的。 GC偶尔检查以查看哪些对象仍可到达。任何不可访问的对象都会释放其内存。无处不在跟踪最后一次对象的实时引用是什么。

4

你的问题没有意义。
管理对象永远不会被明确地破坏。

相反,垃圾收集器会在释放最后一次引用后的某个时间收集每个对象。
如果对象有一个终结器,GC将在GC线程上运行它,然后收集对象。

+0

我只是说我不调用任何Dispose()方法,因此我不“明确地”调用任何Finalizer/Destructor但我想知道是谁做的。 –

+1

狒狒:正如SLaks和@Damien所说的,“谁”是GC。你的问题的答案是“不”。 – TrueWill