potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

C# P/InvokeとCOM呼び出し時、UnmanagedType.LPWStrはout指定でMarshal.FreeCoTaskMemされる

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

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

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