PtrToStringChars,如何释放内存?

时间:2015-04-01 06:49:23

标签: .net visual-c++ memory memory-management c++-cli

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

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

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

2 个答案:

答案 0 :(得分:3)

您的retVal指向托管String对象包含的实际缓冲区。缓冲区被固定(gc无法移动/解除它),直到retVal超出范围,因此您最好确保您的env-> NewString不缓存指针的值。 至于释放内存,因为它由托管对象拥有,它将由垃圾收集器处理。

答案 1 :(得分:3)

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

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

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

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