本机 C++ 库 - 谁必须释放内存以及如何释放?

ggu*_*rov 5 c++ android memory-management native

这是关于安卓。情况:

C++ 库和 java 包装类以及用于处理库中 C++ 类的本机函数 (JNI)。当普通java代码需要C++对象时,它会创建相应的java包装对象,该对象通过本地函数创建C++对象并记住'long'变量中指向本地对象的指针。在接下来的所有操作中,包装器将此指针提供给本机函数等。

问题:

最后如何释放所有分配的C++对象?目前每个包装类都有'finalize'方法,它调用本地函数来释放C++对象,但Android不保证'finalize'的调用!另一方面,通常 C++ 库不知道 java 代码分配了多少和什么类型的 C++ 对象。

当我们的 java 应用程序终止时,剩余的分配内存会发生什么,当操作系统卸载库时,Android 会自动释放从本机库使用的整个堆吗?

Sev*_*yev 3

在进程生命周期结束时,所有进程内存(Java 和 C++ 堆)将被系统释放和回收。但有一件事是,Android 活动关闭并不一定会结束该进程。我不确定那里的进程关闭政策是什么。

另一方面,依靠垃圾收集和 Finalize() 对我来说听起来像是可靠的设计。您声称 - “Android 不保证finalize()”。你有引用吗?因为如果它带有“当对象作为进程关闭的一部分被释放时......”的免责声明,那么我们仍然很好。

如果您非常偏执,您可以编写自己的 malloc()/free()/realloc() 包装器,存储所有已分配对象的列表,并引入一个清理函数来遍历列表并释放它们。然而,包含的 Java 对象可能会以一种奇怪的僵尸状态结束,其中它们下面的内存已被释放。这是一个很棘手的命题,很容易出错。所以我仍然会说 - 对垃圾收集器有信心。缺乏它会......令人不安。