2015-08-26 2 views
-2

Я работаю над кодом, написанным на MC++ (управляемые расширения C++) Я знаю, что деструктор преобразуется в Finalize после компиляции.Деструктор, вызываемый более 10000 раз в mC++

Но при выполнении образца эта финализация вызывается более 10000 раз. Этот призыв отображается в журнале отладки файла, как: -

Finalize() - Entry 
Finalize() - Exit 

Finalize() - Entry 
Finalize() - Exit 
. 
. 
. 
. 
& so on.. 

Я хочу знать причину этих многочисленных вызовов окончательной доработки. Каковы могут быть возможные причины?

Эти множественные вызовы для завершения отображаются в моих журналах Debug. Также, целесообразно ли размещать журналы отладки внутри деструктора (финализировать) при кодировании в mC++?

Код деструктор, как: -

~Destructor() 
{ 
    //Debug Entry log 
    ....... 
    if(condition) 
    { 
      //some code 
    } 
    else 
    { 
      ReRegisterForFinalize(this); 
    } 
    //Debug Exit log 
} 

Кроме того, GC :: ReRegisterForFinalize (объект) метод добавляет текущий OBJ в очередь финализации для завершения. Теперь после вызова этого метода, точно после того, сколько времени будет вызываться finalize? будет ли окончательная редакция вызываться немедленно или она является недетерминированной?

+4

Как любой может ответить на этот вопрос, если вы не включите часть своего кода? – john

+0

Где вы звоните ReRegisterForFinalize? ReRegisterForFinalize может привести к завершению работы объекта более одного раза, даже если он уже завершен. Посмотрите пример этого метода в MSDN. Если вы вызовете его в деструкторе, ваш объект может быть финализирован много раз. – Botz3000

+0

@ Botz3000 ReRegisterForFinalize вызывается внутри деструктора. Но если объект завершен, зачем его нужно снова называть? Кроме того, следует ли размещать журналы отладки внутри деструктора или нет? Я имею в виду, правильно ли разместить лог-файлы внутри деструктора? – User1234

ответ

0

ПРИМЕЧАНИЕ. Предполагается, что вы действительно используете Managed Extensions для C++, как предлагает ваш вопрос, а не C++/CLI, как предлагают ваши теги. Если вы используете C++/CLI, все совершенно по-другому.

Финализатор вызывается из-за вашего звонка на номер ReRegisterForFinalize.

Когда объект имеет финализатор, он будет автоматически добавлен в очередь финализации, вам не обязательно это делать самостоятельно. Когда объект готов к завершению, финализатор может вызываться средой выполнения в некоторой (неопределенной) точке (или вами, используя delete). Теперь, когда вы вызываете ReRegisterForFinalize, вы указываете время выполнения, что он должен снова вызвать финализатор , который может повторяться для любого количества раз.

Когда вы находитесь в финализации, ваш объект уже завершен, поэтому вызов ReRegisterForFinalize не имеет смысла (если у вас есть особый повод для этого).

+0

Спасибо за ответ :) – User1234

+0

Еще одна вещь, которую я хочу задать, при выполнении той же точки с точкой в ​​cmd и vs2010 порядок вызовов деструкторов отличается. что может быть причиной этого? – User1234

+0

@kapilsharma При работе через визуальную студию такие вещи могут быть разными, потому что вы отлаживаете приложение. Порядок вызовов деструктора не определен, поэтому их можно вызвать в любом порядке. Визуальной студии, возможно, придется немного сохранить некоторые объекты, чтобы включить отладку. – Botz3000

Смежные вопросы