overlappedFreeError MDA

更新 : 2007 年 11 月

オーバーラップされた操作が完了する前に Overlapped.Free(NativeOverlapped*) メソッドが呼び出されると、overlappedFreeError マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) がアクティブになります。

症状

アクセス違反またはガベージ コレクションされたヒープの破損。

原因

操作が完了する前にオーバーラップされた構造が解放されました。オーバーラップされたポインタを使用する関数は、解放された後に構造に書き込む可能性があります。この場合、別のオブジェクトがこの領域を占有することによってヒープが破損する可能性があります。

オーバーラップされた操作が正常に起動しなかった場合、この MDA はエラーを発生しないことがあります。

解決策

Free(NativeOverlapped*) メソッドを呼び出す前に、オーバーラップされた構造を使用している I/O 操作が必ず完了するようにします。

ランタイムへの影響

この MDA は、CLR への影響はありません。

出力

この MDA のサンプル出力を次に示します。

An overlapped pointer (0x00ea3430) that was not allocated on the GC heap was passed via Pinvoke to the win32 function 'WriteFile' in module 'KERNEL32.DLL'. If the AppDomain is shut down, this can cause heap corruption when the async I/O completes. The best solution is to pass a NativeOverlappedStructure retrieved from a call to System.Threading.Overlapped.Pack(). If the AppDomain exits, the CLR will keep this structure alive and pinned until the I/O completes.

構成

<mdaConfig>
  <assistants>
    <overlappedFreeError/>
  </assistants>
</mdaConfig>

参照

概念

マネージ デバッグ アシスタントによるエラーの診断

相互運用マーシャリングの概要

参照

MarshalAsAttribute