2016-09-23 44 views
0

C++代碼調用返回字符串的C#方法。我應該如何釋放C++中分配的非託管內存?我應該使用免費()還是刪除?如何釋放由C#編組從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

據我所知,我不能使用BSTRs的非Windows系統。我對麼? – Maksim

+0

嗯。是的....你打算在Windows上使用COM除外?我意識到自己是一名Windows編程人員,除了在外圍設備之外,並沒有跟上其他平臺,但我不知道任何嚴重的應用程序級別的COM實現,除了Windows上的微軟......這是他們的技術。 –