C++/CLIでは、ネイティブスレッド(CreateThread()からのハンドル)およびCreateFiber/ConvertThreadToFiberからのファイバのLPVOID )。ファイナライザはランダム例外を発生させ、ランダムエラーを発生させ、アプリケーションをハングアップさせます。
私が得たアドバイスMSDNファイナライザ(!Fiber())のアンマネージリソースをクリーンアップし、デストラクタ(〜Fiber())がファイナライザを呼び出しています。ここで
はコードです:
Fiber::~Fiber() {
this->!Fiber();
}
Fiber::!Fiber() {
if (thread!=NULL) {
delete thread;
thread=NULL;
}
if (fiber!=NULL) {
DeleteFiber(fiber);
fiber=NULL;
}
}
私は、2本のファイバを作成し、それらをテストし、それが彼らと一緒に行うのようにそれらを配置するテストアプリを持っています。最初のものは上手く配置されています。最後の1は、プログラムの最後の行に配置され、そしてそれは、3つの異なる方法のいずれかで出てクラッシュさ:
Unhandled Exception: System.AccessViolationException: Attempted to read or write
protected memory. This is often an indication that other memory is corrupt.
at DeleteFiber(Void*)
at System.Threading.Fiber.!Fiber()
at System.Threading.Fiber.Dispose(Boolean)
at System.Threading.Fiber.Finalize()
エラーは、ラインから来ることができます。
delete thread;
同様。
OutOfMemoryExceptionでクラッシュしたり、プログラムがスタックオーバーフローを経験してコンソールがハングアップしていると言って、しばらくの間ハングすることがあります(cmd.exeを閉じて回復する必要があります)。
私はデストラクタ/ファイナライザをコメントし、プログラムを実行した場合、それは完璧に動作しますが、プログラムが終了するまで、私はアンマネージリソースをぶらぶらしたくないので、それはオプションではありません...
DeleteFiber()メソッドの外観はどうなっていますか? –
[これに似ています。](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682556(v = VS.85).aspx) –