2011-07-18 61 views
1

我需要很多的轉換,從System::String^char*我CLI的包裝和我寫的函數,但是在返回前char*我不能釋放堆空間! (渡過的時間堆錯誤)轉換系統::字符串爲char *在功能上與StringToHGlobalAnsi

轉換

char* ManagedReaderInterface::SystemStringToChar(System::String ^source) 
{   
    char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(source); 

    return str2; 
} 

我使用的功能等:

GetSomething(SystemStringToChar(str), value); 

任何想法?

+0

首先你可以使用'char *'而不是'System :: String'。因爲你正在做'很多'轉換 –

+0

它是一個本地C++類的包裝,是的它應該是一個CLI:CLI函數中的System:String! – leon22

回答

4

最終,有人需要負責釋放存儲返回值的內存。它不能是您的轉換函數,因爲它會在您釋放內存之前返回。

如果您使用std::string代替原始char* s,這一切都會變得更加簡單。試試這個:

#include <msclr/marshal_cppstd.h> 
...  
GetSomething(msclr::interop::marshal_as<std::string>(str).c_str(), value); 
+0

謝謝!但我只能轉換爲const char *而不是char *? – leon22

+0

這只是一個例子 - 如果你真的想使用'char *',那麼你可以創建一個自定義'raii'包裝器,當它超出範圍時釋放內存。 –

+0

我有這個問題,你的答案解決了我的解決方案。另外,感謝StackOverflow.com因爲識別標點符號 –

2

在每個單獨的方法:

IntPtr memHandle = Marshal::StringToHGlobalAnsi(string); 

try 
{ 
    char *charStr = static_cast<char*>(memHandle .ToPointer()); 

    // do something with charStr 

    Marshal::FreeHGlobal(memHandle); // free space -> Attention: don't delete it to soon 
} 
catch 
{ 
    ... 
} 

它現在應該是乾淨的!

+0

'免費空間 - >注意:不要太快刪除它,所以在這些事項上擁有比谷歌更有效的搜索引擎' 我只想知道。因爲我的應用程序在這裏隨機崩潰。 – sajas