PtrToStringChars,如何释放内存?

PtrToStringChars, how to free memory?

我正在使用 PtrToStringChars 方法获取指向由托管字符串保存的字符数组的指针。然后我将该字符数组转换为 jstring 并将其返回给调用函数。在这样做之前,如何释放字符数组占用的内存? 这是我的代码。

System::String *result=L"Checking";
const __wchar_t __pin * retVal = PtrToStringChars(result);
return env->NewString((jchar *)retVal,(jsize) wcslen(retVal));

这里,如何释放retval指向的内存?

您的 retVal 指向托管 String 对象持有的实际缓冲区。缓冲区被固定(gc 不能 move/dismiss 它)直到 retVal 超出范围,所以你最好确保你的 env->NewString 不缓存指针的值。 至于释放内存,由于它属于托管对象,因此将由垃圾收集器处理。

没有需要释放的内存,PtrToStringChars() returns一个直接指向System::String缓冲区的内部指针。垃圾收集器知道如何在移动缓冲区时找到它并更新它。

您确实需要固定该指针,以便 GC 在执行 NewString() 函数时无法移动缓冲区。这是一种非常便宜的固定,没有为它创建句柄。 非常重要的是 NewString() 复制字符串内容而不是传递的指针。代码执行离开包含引脚的块后指针变为无效。

您使用旧的托管 C++ 语法,它在过去十年中已被弃用,并且在 VS2015 中将不再适用。正确的 C++/CLI 语法是:

System::String^ result = "Checking";
pin_ptr<const wchar_t> retVal = PtrToStringChars(result);
return env->NewString((jchar*)retVal, result->Length);