2016-09-23 4 views
0

C++コードは文字列を返すC#メソッドを呼び出します。割り当てられたアンマネージメモリをC++で解放する方法は?私はfree()かdeleteを使うべきですか?C#からC++にマーシャリングすることによって割り当てられたアンマネージメモリを解放する方法

のC#:

[Guid("52E4971F-E075-41BA-A84F-B6BE8BD66A21")] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[ComImport] 
public interface ISomeInterface 
{ 
    [return: MarshalAs(UnmanagedType.LPWStr)] 
    string SomeMethod([MarshalAs(UnmanagedType.LPWStr)] string text); 
} 

C++:

class SomeClass 
{ 
    virtual int32_t __stdcall _someMethod(const char16_t *text, char16_t **r) = 0; 

    char16_t * someMethod(const char16_t *text) 
     { 
      char16_t * result; 
      _someMethod(text, &result); 
      return result; // how to correct release this memory? 
     } 
} 

ソリューションは、Windows上だけでなく、Linux上で動作します。

+1

可能な限り最良の方法で対応できるように、コードを表示してください。 –

答えて

0

あなたは、このようなCOMの署名を持つオブジェクトを呼び出すと仮定:

interface MyObj 
{ 
    HRESULT __stdcall MethodOrProp([out, retval] BSTR* SomeStringReturned); 
}; 

その後、あなたはSysFreeStringのを呼び出します。

MyObj* pObj; 
// .... 

BSTR bstr = NULL; 
HRESULT hr = pObj->MethodOrProp(&bstr); 
if (SUCCEEDED(hr)) 
{ 
    // ... do junk with string ... 
    SysFreeString(bstr); 
} 

しかし、Visual Studioを使用している場合は、心配する必要はなく、CComBSTRを使用してください。デストラクタであなたのためにクリーンアップを行います。

CComBSTR ccbString = NULL; 
HRESULT hr = pObj->MethodOrProp(&ccbString); 
if (SUCCEEDED(hr)) 
{ 
    // ... do junk with string ... 
} 
// some time at end of scope, destructor of ccbString will clean it up 
+0

お返事ありがとうございます。私は問題の説明にさらに詳しい情報を追加しました。もう一度見ていただけますか? – Maksim

+0

私が理解しているように、Windows以外のシステムではBSTRを使用できません。私は正しいですか? – Maksim

+0

うーむ。はい.Windows以外はどこでCOMを使用しますか?私はWindowsプログラマであり、周辺部を除いて他のプラットフォームに追いついていないことは分かっていますが、Windows上のMicrosoftを除いてCOMの深刻なアプリケーショングレードの実装についてはわかりません。 –

関連する問題