rid*_*rid 40 java java-native-interface
传递后,我应该释放分配的字符串NewStringUTF()吗?
我有一些类似的代码:
char* test;
jstring j_test;
test = some_function(); // <- malloc()s the memory
j_test = (*env)->NewStringUTF(env, test);
free(test); // <- should this be here?
Run Code Online (Sandbox Code Playgroud)
当我将字符串传递给它后释放它时NewStringUTF(),我收到一个signal 11 (SIGSEGV), fault addr deadbaad错误.如果我删除了free()呼叫,则错误消失.我究竟做错了什么?
我看到相互矛盾的意见.有人说我应该自己释放它,有人说VM会释放它,有人说VM没有释放它,你应该做一些奇怪的伏都魔术来释放它.我糊涂了.
fiz*_*zer 71
const char*参数的存储NewStringUTF()完全由您负责:如果您分配test了malloc(),那么您需要free()它.所以,你发布的代码片段是正确的.你正在腐蚀其他地方的堆.
我看到相互矛盾的意见.有人说我应该自己释放它,有人说VM会释放它,有人说VM没有释放它,你应该做一些奇怪的伏都魔术来释放它.我糊涂了.
他们正在谈论jstring返回的实例NewStringUTF().这遵循了"本地参考"的混乱规则.
DeleteLocalRef()完成后,释放此引用绝不是错误.但是,如果NewStringUTF()在JVM线程的上下文中调用,JVM会执行一些可疑的魔法.当本机方法返回Java时,将自动清除任何泄漏的本地引用.因此,如果您确定您的最终调用者是在Java线程中,那么您可以安全地泄漏引用.
另一方面,如果您在本机线程的上下文中运行 - 例如,某些事件报告线程对Java进行回调 - 那么永远不会返回到Java,因此您必须DeleteLocalRef()在此处调用自己jstring(实际上所有其他本地典型JNI调用返回的引用).