potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C# P/InvokeとCOM呼び出し時、UnmanagedType.LPWStrは強制的にMarshal.FreeCoTaskMemされる

P/InvokeとCOM呼び出し時、UnmanagedType.LPWStrMarshal.FreeCoTaskMemは不要らしいです。CoTaskMemFreeが必要なLPWSTRout IntPtrout SafeHandleで受け取らなくても、out stringで受け取れば自動でMarshal.FreeCoTaskMemされるそうです。

ただし複数回のコピーが発生するため、大きなデータの一部を扱う場合はout IntPtrなどで受け取った方が良いかもしれません。また、LocalFreeHeapFreeで解放すべきメモリはUnmanagedType.LPWStrout stringを指定するとメモリリークにつながる可能性があります。

UnmanagedType.LPStrも変換処理は入りますが同様に解放されるそうです。