2012-04-26 3 views
-1

Я попытался очистить память неуправляемых классов от C++/cli finalizer, и это дало мне ошибку AcessViolation. Я делаю что-то вроде этого:Нарушение прав доступа к неуправляемой памяти из финализатора

MyClass::!MyClass() 
{ 

    if(_unmanaged) 
    { 
    _unmanaged->Delete(); 
    _unmanaged = 0; 
    } 
} 

Может ли кто-нибудь знать, в чем проблема? Спасибо за ответы.

+0

Что делает '_unmanaged-> Delete()' do? – Nick

+0

_unmanaged, в моем случае, класс vtk, Delete - стандартная процедура для очистки объектов vtk. Это может быть другой метод неуправляемого класса, в любом случае это будет AccessViolation. –

+0

Я не уверен, почему вы устанавливаете '_unmanaged' в ноль? – Nick

ответ

0

Хорошо, у меня есть одна догадка.

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

Я видел ваш комментарий о «уже удаленном объекте», но я бы его еще раз проверил.

MyClass::~MyClass() 
{ 
    this->!MyClass(); 

    GC::KeepAlive(this); 
} 
+0

Финализатор работает в своем потоке, но если что-то имеет ссылку на объект, который требуется для вызова Dispose, сборщик мусора не будет его трогать. –