回答編集履歴

2

修正

2023/09/29 01:12

投稿

nururi
nururi

スコア136

test CHANGED
@@ -3,8 +3,7 @@
3
3
 
4
4
  > Windows 固有: [Out] 文字列の場合、CLR は文字列を解放するために既定で CoTaskMemFree を使用します。また、UnmanagedType.BSTR とマークされている文字列の場合は SysStringFree を使用します。
5
5
 
6
- これらを踏まえた上で、下のURLの内容を見てください。異なるメモリアロケータでも、実装が同じというケースは有りえるようです。
6
+ これらを踏まえた上で、下のURLの内容を見てください。異なるメモリアロケータでも、実装が同じになるケースは有りえるようで、たまたま違うメモリ解放関数でも解放されただけと推測されます。
7
- たまたま違うメモリ解放関数でも解放されただけで、Windowsのバージョンやランタイムが変われば違う動作になる事もありえます。
8
7
  [CoTaskMemAlloc v malloc v AllocHGlobal](https://stackoverflow.com/questions/36420692/cotaskmemalloc-v-malloc-v-allochglobal)
9
8
 
10
9
  マーシャラーの挙動を完全に理解していたとしても、ネイティブDLL側で確保したメモリを ref string で受けるのは、個人的にかなり怖い作りだなと思います。

1

修正

2023/09/29 01:10

投稿

nururi
nururi

スコア136

test CHANGED
@@ -1,16 +1,15 @@
1
- https://learn.microsoft.com/ja-jp/dotnet/standard/native-interop/best-practices
1
+ [ネイティブ相互運用性のベスト プラクティス](https://learn.microsoft.com/ja-jp/dotnet/standard/native-interop/best-practices)
2
2
  > ❌ 禁止: [Out] string パラメーターを使用しないでください。 文字列がインターン処理された文字列で、文字列パラメーターが [Out] 属性の値で渡された場合、ランタイムが不安定になる可能性があります。 文字列のインターン処理の詳細については、String.Intern のドキュメントを参照してください。
3
3
 
4
4
  > Windows 固有: [Out] 文字列の場合、CLR は文字列を解放するために既定で CoTaskMemFree を使用します。また、UnmanagedType.BSTR とマークされている文字列の場合は SysStringFree を使用します。
5
5
 
6
- これらを踏まえた上で、下のURLの内容を見てください。
7
- 異なるメモリアロケータでも、実装が同じというケースは有りえるようです。
6
+ これらを踏まえた上で、下のURLの内容を見てください。異なるメモリアロケータでも、実装が同じというケースは有りえるようです。
7
+ たまたま違うメモリ解放関数でも解放されただけで、Windowsのバージョンやランタイムが変われば違う動作になる事もありえます。
8
- https://stackoverflow.com/questions/36420692/cotaskmemalloc-v-malloc-v-allochglobal
8
+ [CoTaskMemAlloc v malloc v AllocHGlobal](https://stackoverflow.com/questions/36420692/cotaskmemalloc-v-malloc-v-allochglobal)
9
9
 
10
10
  マーシャラーの挙動を完全に理解していたとしても、ネイティブDLL側で確保したメモリを ref string で受けるのは、個人的にかなり怖い作りだなと思います。
11
11
 
12
- https://learn.microsoft.com/ja-jp/dotnet/framework/interop/default-marshalling-behavior#unmanaged-signature
12
+ [既定のマーシャリングの動作](https://learn.microsoft.com/ja-jp/dotnet/framework/interop/default-marshalling-behavior#unmanaged-signature)
13
-
14
13
 
15
14
  > 使用しているメモリが CoTaskMemAlloc メソッドで割り当てられていない場合、IntPtr を使用し、適切なメソッドを使用して手動でメモリを解放する必要があります。
16
15