4

アンマネージ コードから呼び出されたマネージ COM インターフェイスがある場合、使用後にメモリを解放する責任はありますか? それともガベージ コレクションによって処理されますか?

 public void WriteOutFile([In] [MarshalAs(UnmanagedType.BStr)] String data)
 {
      File.WriteAllText(fileName, data);
      //do I need the line below??
      Marshal.FreeBSTR(data);
 }

ありがとう

4

2 に答える 2

4

マーシャリングには、アンマネージド メモリからマネージド メモリへのデータのコピーが含まれます。stringインスタンスはマネージド オブジェクトであるため、解放する必要はありません。ただし、コールバック呼び出しの前にネイティブ コードでメモリを割り当てた場合は、コールバック呼び出しの後にネイティブ コードでメモリを解放する必要があります。

于 2012-05-12T08:25:35.813 に答える
3

呼び出し元は渡されたデータを再利用する可能性があり、解放するとエラーが発生する可能性があるため、文字列を解放しないでください。その理由は、FreeBSTR参照カウント メカニズムを使用せず、単純にSysFreeStringを呼び出すためです。ちなみに、文字列が関数の 1 つに割り当てられていると想定していますがSys(Re)Alloc...、マネージ コードでは認識されていません。ここに示されている例は興味深いものです。あなたを呼び出しているアンマネージコードがこれであると想像してください (前のリンクから):

// shows using the Win32 function 
// to allocate memory for the string: 
BSTR bstrStatus = ::SysAllocString(L"Some text");
if (bstrStatus != NULL)
{
   pBrowser->put_StatusText(bstrStatus);
   // Free the string:
   ::SysFreeString(bstrStatus);
}

put_StatusText(...)マネージコードに実装されているので、状況を再現しています。ご覧のとおり、呼び出し先の外部で、パラメーター文字列の割り当て/割り当て解除を担当する呼び出し元です。

于 2012-05-12T08:24:52.210 に答える