当前位置: 首页 > 面试题库 >

NewStringUTF()和释放内存

邓阳伯
2023-03-14
问题内容

我应该在将分配的字符串传递给之后释放它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调用返回的引用)。



 类似资料:
  • 问题内容: 在以下示例中,我有一些有关内存使用的相关问题。 如果我在解释器中运行, 我的机器上使用的实际内存最高为80.9mb。那我 实际内存下降,但仅限于。解释器使用基线,因此不向 释放内存有什么好处?是否因为Python正在“提前计划”,以为你可能会再次使用那么多的内存? 它为什么特别释放- 释放的量基于什么? 有没有一种方法可以强制Python释放所有已使用的内存(如果你知道不会再使用那么多

  • 我有一个问题,我的GPU内存是没有释放后关闭在Python中的tenstorflow会话。这三行足以导致问题: 在第三行之后,内存不会被释放。我在很多论坛上走来走去,尝试了各种各样的建议,但都没有效果。有关详细信息,请参见下面我的评论: https://github.com/tensorflow/tensorflow/issues/19731 在这里,我已经记录了我设法杀死进程并释放内存的方法,但

  • 我改进了代码,以便从垃圾收集器中获得更好的结果。 现在,当我调用时,它确实释放了所有内存。但是,当我在不调用 的情况下观察内存使用情况时,应用程序确实会保留并使用越来越多的内存。 这是否意味着我的改进正在起作用,我的所有引用都是正确的,我可以忽略JVM是如何自己释放内存的。或者,我的代码中是否存在其他问题,这些问题是JVM在不运行垃圾收集器的情况下保留更多内存的原因。

  • 我对std::memory\u order\u acquire和std::memory\u order\u release的理解如下: Acquire意味着在Acquire fence之后出现的内存访问不能重新排序到fence之前。 释放意味着在释放栅栏之前出现的任何内存访问都可以重新排序为栅栏之后。 我不明白的是,为什么在C 11原子库中,获取界限与加载操作相关联,而发布界限与存储操作相关联。

  • 问题内容: 我正在使用以下功能下载小于20MB的文件。它将全部内容读取到内存中,因为另一个功能必须先对字节执行工作,然后才能将其写入磁盘。 这可以正常工作,但是所有内存都在系统上消耗了。 是否可以在其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数? 问题答案: 您可能会触发gc使用释放未使用的对象,并且可能敦促Go运行时使用释放内存到OS ,但是所有这些都只是在扑救。编

  • 我设置了一个python代码来运行Selenium。在运行结束时,我使用来关闭实例。()我认为它应该从内存中释放(我在Windows 7上)。但是,每次运行之后,内存中都会保留一个实例。我希望有一种方法可以用python编写一些东西来终止进程。显然,不能完成这项工作。多谢了。