Как узнать, кто уничтожил объект? - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь понять, где важный объект называется его деструктором.Я сделал явное, чтобы записать трассировку стека, которая к нему приводит.

Но new StackFrame(1).GetMethod().Name; выдает NullReferenceException, и я не уверен, что смогу использовать этот подход, так как Destructor (~MyClass(){}) явно не вызывается приложением (во всяком случае, я думаю, что вы не можете).

Есть ли способ узнать трассировку стека, ведущую к уничтожению объекта?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Ваш вопрос не имеет смысла.
Управляемые объекты никогда не уничтожаются явно.

Вместо этого сборщик мусора будет собирать каждый объект через некоторое время после освобождения последней ссылки на него.
Если у объекта есть финализатор , GC запустит его в потоке GC, прежде чем собирать объект.

3 голосов
/ 27 июля 2011

Финализаторы (то, что вы пишете, они не деструкторы, даже если они могут использовать тот же синтаксис, что и деструкторы в C ++), запускаются в потоке, принадлежащем сборщику мусора.В трассировке стека нет ничего относящегося к вам, даже если бы вы могли добраться до него.

Как правило, нет способа узнать, какие события приводят к уничтожению объекта, поскольку уничтожение объекта является недетерминированным.СЕТЬ.GC иногда проверяет, какие объекты еще доступны.Любой недоступный объект освобождает память.Нигде не отслеживается, какой была последняя живая ссылка на объект.

...