私はC/C#境界を越えてデータをマーシャリングしています。次のようにコールバックが定義されているコールバック内でIntPtrをリリースする必要がありますか?
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Message
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string From;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Subject;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Body;
}
:私は、次のような構造を持っている
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void MessageReceiveDelegate([In]IntPtr ptrToMessage);
private void MessageReceiveCallback(IntPtr ptrToMessage)
{
Message message = (Message)Marshal.PtrToStructure(ptrToMessage, typeof(Message));
Marshal.FreeHGlobal(ptrToMessage); //This throws COMException!
}
私の質問、私はメモリリークを避けるために、コールバック内のIntPtr(ptrToMessage)を放出心配する必要はありませんか?私はそれにFreeHGlobalを呼び出してみましたが、以下の例外を除いて終わる:
タイプ 「System.Runtime.InteropServices.COMException」の未処理の例外が
がmscorlib.dllで発生しました追加情報:ハンドル無効です。 ( HRESULTからの例外:0x80070006(E_HANDLE))
だから私はどちらか何か間違ったことをやっている、またはメモリは私によって解放する必要はありません。
あなたのコードが 'Intptr'の所有者でない場合(つまり、割り当てられていない場合)は、APIドキュメントが必要な場合を除いて解放しないでください。 'Marshal.FreeCoTaskMem'のようにバッファを解放するために別の' Marshal'メソッドを使う必要があるかもしれません。 – GreatAndPowerfulOz
@ Great.And.Powerful.Oz IntPtrを割り当てませんでした。それは第三者図書館から私に渡されています。以前FreeCoTaskMemを試してみましたが、例外ではなくクラッシュが発生しました。 – Eternal21