【发布时间】:2011-08-04 18:57:37
【问题描述】:
尝试分配内存失败时会抛出异常吗?
我最近才知道 Android 支持异常。
【问题讨论】:
-
为什么要添加jni标签?我的问题与 jni 无关。
标签: android c++ exception android-ndk new-operator
尝试分配内存失败时会抛出异常吗?
我最近才知道 Android 支持异常。
【问题讨论】:
标签: android c++ exception android-ndk new-operator
我下载了 ndk,并在 docs 文件夹 CPLUSPLUS-SUPPORT.HTML 中找到了这个。
我。 C++ 异常支持:
NDK 工具链支持 C++ 异常,自 NDK r5 起,但所有 C++ 默认情况下,源编译时使用 -fno-exceptions 支持,例如 与以前版本的兼容性原因。
要启用它,请使用“-fexceptions”C++ 编译器标志。这可以做到 通过将以下内容添加到您的 Android.mk 中的每个模块定义:
LOCAL_CPPFLAGS += -fexceptions更简单地说,在 Application.mk 中添加一行,设置将 自动应用到您项目的所有 NDK 模块:
APP_CPPFLAGS += -fexceptions注意:为向后提供的过时“arm-eabi-4.4.0”工具链 与此 NDK 的兼容性不支持异常!
所以似乎支持异常,只要应用程序使用“-fexceptions”编译。所以我的理解是,使用 -fexceptions 编译的代码会在分配内存失败时抛出 std::bad_alloc。
【讨论】:
我认为 Android 不支持异常。如果最近更改了此内容,您可以发布指向您的参考文章的链接吗?我的印象是使用 new 运算符分配失败将在 Android 上返回一个空指针。
在这种情况下,如果您在终端上使用(nothrow),您应该遵守它们的默认分配行为并在 Android 上获得与预期相同的结果。
【讨论】:
-fexceptions 重新编译整个 NDK 才能启用它们。但是,我会非常警惕它对 STL 和标准 C++ 异常的支持程度。我仍然建议使用 (nothrow) 来避免整个混乱,因为 Android 在设计时并没有考虑到例外情况。