2

我是android编程的新手。我有一个使用 NDK-Build 构建的本机 C 应用程序。我正在其中一个线程中进行静态分配。

整数 X[64][4096];//<-- 恰好需要 1 MB 空间。

当我使用 adb shell 运行它时,我得到一个“分段错误”。如果我将数组减少到 X[63][4096],它似乎运行良好。现在我知道在 android 中有 16MB 或类似的限制用于 VM,但这个程序几乎不分配占用 2MB 的 RAM(并且设置-> 应用程序显示我还有另外 650 MB 的备用 RAM)。

知道什么可能导致这次崩溃吗?以及如何解决?

问候

4

2 回答 2

5

您所做的分配实际上不是静态的。如果X是函数内部的局部变量,它将在每次进入函数时动态分配在堆栈上(通常比堆小得多),并在函数返回时释放。

如果你真的X想要是静态的(即应该X在线程函数的所有实例中共享一个副本),你可以声明变量static
如果您打算让每个线程都有自己的 X 副本,您应该明确地使用在堆上分配空间malloc() / new []并使用free() / delete [].

于 2012-12-17T20:50:02.053 回答
1

我正在尝试将游戏从 Linux 移植到 Android,但是我在 Android 的 1 MB 堆栈中遇到了很多麻烦,这完全不够用,并且会导致整个地方的段错误。在 Linux 上,默认堆栈大小为 8 MB,而在 Windows 上,堆栈可以在 VS 中轻松配置。有没有办法增加 Android NDK 上的堆栈大小,所以我不必用缓慢而丑陋的 malloc/free 替换我所有的固定数组?

于 2015-05-09T17:41:18.287 回答