什么时候需要使用FreeHGlobal()?

时间:2011-10-07 20:28:36

标签: visual-c++ c++-cli

如果我使用Marshal::StringToHGlobalAnsi如下:

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

我需要使用Marshal::FreeHGlobal()吗?如果,我应该给出什么参数?

3 个答案:

答案 0 :(得分:4)

根据MSDN - 是的,您需要致电FreeHGlobal。 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.stringtohglobalansi%28v=VS.100%29.aspx

  

因为此方法分配了a所需的非托管内存   字符串,通过调用FreeHGlobal

总是释放内存

答案 1 :(得分: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);

答案 2 :(得分:1)

附上Marshal :: FreeHGlobal的2个练习代码 需要注意的是,Marshal :: 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));