【发布时间】:2018-07-08 14:25:12
【问题描述】:
谷歌在Android ndk guides site写道:
在一个库中分配内存,在另一个库中释放,导致内存泄漏或堆损坏。
- 为什么?
- 总是正确的?
编辑
正如@Galik 所写,这句话的上下文是:
在 C++ 中,在单个程序中定义多个相同函数或对象的副本是不安全的。这是 C++ 标准中存在的单一定义规则的一个方面。
当使用静态运行时(以及一般的静态库)时,很容易意外违反此规则。例如,以下应用程序违反了此规则:
...
在这种情况下,STL,包括全局数据和静态构造函数,将出现在两个库中。这个应用程序的运行时行为是未定义的,在实践中崩溃是很常见的。其他可能的问题包括:
- 在一个库中分配内存,在另一个库中释放,导致内存泄漏或堆损坏。
- libfoo.so 中引发的异常在 libbar.so 中未被捕获,导致您的应用崩溃。
- std::cout 的缓冲无法正常工作。
【问题讨论】:
-
不同的库可能使用不同的堆。
-
如果开发者不使用另一个怎么办?
-
根据您链接的文档,这种情况似乎仅在您通过在两个不同的共享库中使用静态 c++ 运行时打破单一定义规则时适用。您只能使用静态运行时来构建单库应用程序。
-
@y30 我不确定,但是通过静态链接,您可以获得包含链接到的所有代码的副本。所以,我想,如果你有两组不同的函数来分配和删除内存,他们可能会各自设置自己的内部簿记数据,告诉他们如何释放他们分配的内容。我想他们每个人都有操作系统提供的完全独立的内存池。
-
我认为这样的问题最好进入Software Engineering
标签: c++ c android-ndk shared-libraries