FreeHGlobal() 是否需要释放函数中传递的非托管字符串?
Is FreeHGlobal() required to free unmanaged string passed in a function?
如果我有下面这段代码:
void foo (String^ v)
{
WCHAR someString[256];
_tcscpy_s(someString, (LPCTSTR)Marshal::StringtoHGLobalUni(v).ToPointer());
}
在这种情况下我还需要使用 FreeHGlobal()
吗?如果是这样,为什么?复制函数不会处理这个全局分配吗?
是的,FreeHGlobal
是必须的。 _tcscpy_s
不知道缓冲区来自哪里;它不知道释放缓冲区。
如果您想要自动释放,您需要使用一些足够智能的对象,以便在它离开作用域时执行释放。 marshal_context
在这里是一个不错的选择。
void foo (String^ v)
{
marshal_context context;
WCHAR someString[256];
_tcscpy_s(someString, context.marshal_as<const TCHAR*>( v ));
} // <-- The marshal_context, and the unmanaged memory it owns,
// are cleaned up at the end of the function.
(免责声明:我不是编译器,可能存在语法错误。)
如果我有下面这段代码:
void foo (String^ v)
{
WCHAR someString[256];
_tcscpy_s(someString, (LPCTSTR)Marshal::StringtoHGLobalUni(v).ToPointer());
}
在这种情况下我还需要使用 FreeHGlobal()
吗?如果是这样,为什么?复制函数不会处理这个全局分配吗?
是的,FreeHGlobal
是必须的。 _tcscpy_s
不知道缓冲区来自哪里;它不知道释放缓冲区。
如果您想要自动释放,您需要使用一些足够智能的对象,以便在它离开作用域时执行释放。 marshal_context
在这里是一个不错的选择。
void foo (String^ v)
{
marshal_context context;
WCHAR someString[256];
_tcscpy_s(someString, context.marshal_as<const TCHAR*>( v ));
} // <-- The marshal_context, and the unmanaged memory it owns,
// are cleaned up at the end of the function.
(免责声明:我不是编译器,可能存在语法错误。)