2012-05-12 12 views
4

管理対象外のコードから呼び出されたCOMインターフェイスを管理している場合は、使用後にメモリを解放するか、ガベージコレクションによって処理されますか?関数のパラメータとして使用するマネージBSTRを解放する必要があります

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

おかげ

答えて

3

、発信者が潜在的に渡されたデータを再利用することができますし、あなたが自由ならば、障害を持つことが可能であるので、あなたは、文字列を解放しないでください。その理由は、FreeBSTRは参照カウントメカニズムを使用せず、文字列が関数Sys(Re)Alloc...の1つで割り当てられていると仮定して、単にSysFreeStringを呼び出します。管理されたコードでは認識していない状況です。

// 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(...)をimlementedています 例shown hereはあなたを呼んアンマネージドコードは(前のリンクから)この1であるIMAGIN、興味深いです。あなたが見ることができるように、パラメータ文字列の割り当て/割り当て解除を担当している呼び出し側はの被呼者です。

4

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

関連する問題