2011-10-07 84 views
2

如果我使用Marshal::StringToHGlobalAnsi如下:何時需要使用FreeHGlobal()?

char *src = (char *)Marshal::StringToHGlobalAnsi(this->Textbox1->Text).ToPointer(); 

我需要使用Marshal::FreeHGlobal()?如果,我應該給什麼參數?

回答

4

根據MSDN - 是的,你需要打電話給FreeHGlobal。 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtohglobalansi%28v=VS.100%29.aspx

由於這種方法分配用於 字符串所需的非託管存儲器,總是通過調用FreeHGlobal

+0

但我需要給'元帥:FreeHGlobal什麼參數()'在我的情況! – Aan

+0

您使用StringToHGlobalAnsi分配了內存。根據文檔你應該釋放這個內存。 – oryol

+0

是的,但在我的情況下,我沒有一個名字,需要免費的內存部分!所以,我沒有'FreeHGlobal()'的具體參數! – Aan

1

C#字符串轉換函數釋放內存是由C++標準絕對可怕。

C++/CLI有自己的字符串轉換助手,它遵循RAII的規則自動清理臨時緩衝區。只需使用:

#include <stdlib.h> 
#include <string.h> 
#include <msclr\marshal.h> 

using namespace msclr::interop; 

marshal_context converter; 
const char *src = converter.marshal_as<const char*>(Textbox1->Text); 
1

附上我的2實踐代碼元帥:FreeHGlobal 需要指出的是元帥:FreeHGlobal()的參數是不同的!

string CPlusPlusString; 
String ^VisualString; 
VisualString=textBox1->Text; 
CPlusPlusString=(char *)Marshal::StringToHGlobalAnsi(VisualString).ToPointer(); 
Marshal::FreeHGlobal(Marshal::StringToHGlobalAnsi(VisualString)); 

char *CString; 
String ^VisualString; 
VisualString=textBox1->Text; 
CString = (char*) Marshal::StringToHGlobalAnsi(VisualString).ToPointer(); 
Marshal::FreeHGlobal(IntPtr(CString)); 
+0

與以下不同的是什麼?'元帥:你可能沒有單獨的變量, :StringToHGlobalAnsi'返回一個'IntPtr',這就是'Marshal :: FreeHGlobal'作爲一個參數。 –