2015-04-01 185 views
1

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

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

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

+0

无关:在同一个进程中混合JVM和CLR?当然,这肯定会导致问题... – immibis 2015-04-01 06:52:40

+1

@immibis曾听说过[IKVM](http://www.ikvm.net/)? ;-) – 2015-04-01 13:34:03

回答

3

没有需要释放的内存,PtrToStringChars()返回一个内部指针,它直接指向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); 
3

您的retVal指向托管字符串对象所保存的实际缓冲区。缓冲区是固定的(gc不能移动/解除它),直到retVal超出范围,所以你最好确保你的env-> NewString不缓存指针的值。 至于释放内存,由于它由被管理对象所拥有,它将由垃圾收集器处理。