NewStringUTF()和释放内存
我应该在将分配的字符串传递给之后释放它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?
在将字符串传递给之后释放字符串时NewStringUTF()
,出现signal 11 (SIGSEGV), fault addr
deadbaad错误。如果我删除free()
呼叫,该错误消失。我究竟做错了什么?
我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。
回答:
const char*
参数to
的存储NewStringUTF()
完全由您负责:如果您分配test
了malloc()
,则需要free()
它。因此,您发布的代码段是正确的。您正在其他地方破坏堆。
我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。
他们正在谈论所jstring
返回的实例NewStringUTF()
。这遵循了“本地引用”的令人困惑的规则。
DeleteLocalRef()
完成此引用后,释放该引用绝对不会出错。但是,如果您NewStringUTF()
在JVM线程的上下文中进行调用,则JVM将执行一些可疑的魔术。当本机方法返回Java时,将自动清除所有泄漏的本地引用。因此,如果您确定最终调用者在Java线程中,则可以安全地泄漏引用。
另一方面,如果您在本机线程的上下文中运行(例如,某些事件报告线程对Java进行了回调),则永远不会返回Java,因此您必须DeleteLocalRef()
在此上jstring
(以及所有其他本地典型的JNI调用返回的引用)。
以上是 NewStringUTF()和释放内存 的全部内容, 来源链接: utcz.com/qa/429571.html