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.

(免责声明:我不是编译器,可能存在语法错误。)