2012-03-26 16 views
2

例:私はそのような機能を備えたC#のCOMオブジェクトを持っている:C++からC#comオブジェクトを呼び出すと、誰がメモリを解放するのですか?

int GetString([In, Out, MarshalAs(UnmanagedType.LPStr)]ref string str) 

それから私は、生成されたラッパーの方法のように宣言されている、(COMオブジェクトは#importキーワードを経て使用されているC++で)C++からint型を呼んでいる:

GetString(LPSTR * str, long * retVal) 

char myStr[40]; 
LPSTR buf = (LPSTR)myStr; 
LPSTR pBuf = &buf; 

pComObject->GetString(pBuf); 

奇妙である何:私はそれをこのように呼んでいる

1)myStr満たされていない、とbuf値は(それが呼び出した後myStrと同じdoesntの)変更しそうですが、私はC#のマーシャラーiがfree(buf);かどうかを呼び出す必要がありますC#はそれほどメモリを割り当てる場合は、メモリ

2)の新しいブロックを割り当てているとし?

答えて

3

はい、クライアントはメモリを解放する必要があります。 この場合、受信したバッファを解放するにはCoTaskMemFree関数を使用する必要があります。バッファはクライアントのヒープ上に割り当てられない可能性があるため。 CoTaskMemFreeは適切なDeleterを呼び出します。

2

はい、私は、GetString関数を呼び出した後、C++コードでバッファを解放する必要があると思います。

COM "Memory Management Rules"によれば、呼び出し元(C++コード)は出力パラメータとして返されるメモリを解放する必要があります。入出力パラメータの場合、呼び出し先(CLRとC#コード)は、渡されたパラメータのメモリを解放し、出力値に新しいメモリを割り当てることができます。また、呼び出し元は解放する必要がありますその記憶。

+0

Upvoted!良い説明と、私はルールを言及している必要があります。 –

関連する問題