2012-04-26 4 views
-1

C++/cliファイナライザからアンマネージクラスのメモリをクリーンアップしようとしましたが、AcessViolationエラーが発生しました。私はこのような何かをする:ファイナライザから非管理メモリへのアクセス違反

MyClass::!MyClass() 
{ 

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

誰でも知っている、何が問題?答えをありがとう。

+0

'_unmanaged-> Delete()'とは何ですか? – Nick

+0

私の場合、vtkクラスを削除するには_unmanaged、vtkオブジェクトをクリーンアップするにはstandartプロシージャを使用します。それは、いずれの場合でもアンマネージドクラスの別のメソッドである可能性がありますが、それはAccessViolationになります。 –

+0

なぜ '_unmanaged'をゼロに設定しているのか分かりません。 – Nick

答えて

0

[OK]を1つ推測します。

ファイナライザは独自のスレッドから動作するため、手動でオブジェクトを破棄しようとすると競合状態が発生する可能性があります。

「既に削除されたオブジェクト」についてのあなたのコメントを見ましたが、もう一度確認します。

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

    GC::KeepAlive(this); 
} 
+0

ファイナライザは独自のスレッドで動作しますが、Disposeを呼び出すために必要なオブジェクトへの参照がある場合、ガベージコレクタはそれに触れません。 –