我使用PtrToStringChars方法获取指向托管字符串所持有的字符数组的指针。然后我将该字符数组转换为jstring并将其返回给调用函数。在此之前,如何释放字符数组占用的内存? 这是我的代码。
System::String *result=L"Checking";
const __wchar_t __pin * retVal = PtrToStringChars(result);
return env->NewString((jchar *)retVal,(jsize) wcslen(retVal));
在这里,我如何释放retval所指向的内存?
答案 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);