.net 释放函数中传递的非托管字符串是否需要FreeHGlobal()?

.net 释放函数中传递的非托管字符串是否需要FreeHGlobal()?,.net,string,c++-cli,unmanaged,.net,String,C++ Cli,Unmanaged,如果我有以下代码: void foo (String^ v) { WCHAR someString[256]; _tcscpy_s(someString, (LPCTSTR)Marshal::StringtoHGLobalUni(v).ToPointer()); } 在这种情况下,我还需要使用FreeHGlobal()?如果是,为什么?复制功能是否不负责此全局分配?是的,FreeHGlobal是必需的\u tcscpy\u s不知道缓冲区来自何处;它不知道如何释放缓冲区 如果你想要

如果我有以下代码:

void foo (String^ v)
{
   WCHAR someString[256];
   _tcscpy_s(someString, (LPCTSTR)Marshal::StringtoHGLobalUni(v).ToPointer());
}

在这种情况下,我还需要使用
FreeHGlobal()
?如果是,为什么?复制功能是否不负责此全局分配?

是的,
FreeHGlobal
是必需的<代码>\u tcscpy\u s不知道缓冲区来自何处;它不知道如何释放缓冲区

如果你想要一个自动释放,你会想要使用一些足够聪明的对象,当它离开作用域时进行释放<代码>封送上下文是一个不错的选择

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(字符串^v)
{
马歇尔语境;
WCHAR someString[256];
_tcscpy_s(someString,context.marshal_as(v));

}//非常感谢。我来看看。如果我对传递给另一个函数的字符串执行该操作,比如,
someFunc((LPTSTR)Marshal::StringToGlobalUni(someManagedString.ToPointer())
,我想应该没问题,因为该操作本来是在副本上执行的,没有任何东西可以在其上执行FreehGlobalMemory?不,这也有同样的问题
StringToHGlobalUni
中包含对
AllocHGlobal
的调用。对
AllocHGlobal
的每次调用都必须有对
FreeHGlobal
的相应调用,您有责任进行调用。谢谢。我明白了。如果我有一个托管字符串,然后使用
StringToHGlobalUni
将其传递给另一个函数,如
someFunc((LPCTSTR)Marshal::StringToHGlobalUni(v).ToPointer())
,那么内存是否仍然需要释放,如果需要,在哪个函数中释放?编译器是否会创建它的副本,并在传递函数边界后销毁它本身,并且它已从托管范围传递到非托管范围?被调用函数是否需要处理调用FreeHGlobal的问题?是的,它仍然需要被释放。您可以在任意一个函数中释放它,但最好传递托管的
字符串^
。当它超出作用域时,它不会被自动清除,因为唯一具有作用域的是指向内存块的指针,而不是内存块本身。