gpt4 book ai didi

java - NewStringUTF() 和释放内存

转载 作者:IT老高 更新时间:2023-10-28 20:47:51 28 4
gpt4 key购买 nike

我应该在将分配的字符串传递给 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 不释放它,你应该用奇怪的巫术魔法来释放它。我很困惑。

最佳答案

NewStringUTF()const char* 参数的存储完全是你的责任:如果你用 malloc 分配 test (),那么你需要free()它。因此,您发布的片段是正确的。您正在其他地方破坏堆。

I see conflicting opinions. Some say I should free it myself, some say the VM frees it, some say the VM doesn't free it and you should do strange voodoo magic to free it. I'm confused.

他们在谈论 NewStringUTF() 返回的 jstring 实例。这遵循了'local references' 的令人困惑的规则。 .

使用 DeleteLocalRef() 释放此引用绝不会出错。但是,如果您在 JVM 线程的上下文中调用 NewStringUTF(),JVM 会执行一些可疑的魔法。当本地方法返回 Java 时,任何泄漏的本地引用都会被自动清除。因此,如果您确定最终调用者在 Java 线程中,那么您可以安全地泄漏引用。

另一方面,如果您在 native 线程的上下文中运行 - 例如,一些事件报告线程对 Java 进行回调 - 永远不会返回 Java,因此您必须调用 DeleteLocalRef() 自己在这个 jstring 上(实际上是典型 JNI 调用返回的所有其他本地引用)。

关于java - NewStringUTF() 和释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6238785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com