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()完全由您负责:如果您分配testmalloc(),则需要free()它。因此,您发布的代码段是正确的。您正在其他地方破坏堆。

我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。

他们正在谈论所jstring返回的实例NewStringUTF()。这遵循了“本地引用”的令人困惑的规则。

DeleteLocalRef()完成此引用后,释放该引用绝对不会出错。但是,如果您NewStringUTF()在JVM线程的上下文中进行调用,则JVM将执行一些可疑的魔术。当本机方法返回Java时,将自动清除所有泄漏的本地引用。因此,如果您确定最终调用者在Java线程中,则可以安全地泄漏引用。

另一方面,如果您在本机线程的上下文中运行(例如,某些事件报告线程对Java进行了回调),则永远不会返回Java,因此您必须DeleteLocalRef()在此上jstring(以及所有其他本地典型的JNI调用返回的引用)。

以上是 NewStringUTF()和释放内存 的全部内容, 来源链接: utcz.com/qa/429571.html

回到顶部