【问题标题】:Do the C++ operators new and new[] throw std::bad_alloc on Android?C++ 运算符 new 和 new[] 会在 Android 上抛出 std::bad_alloc 吗?
【发布时间】:2011-08-04 18:57:37
【问题描述】:

尝试分配内存失败时会抛出异常吗?

我最近才知道 Android 支持异常。

【问题讨论】:

  • 为什么要添加jni标签?我的问题与 jni 无关。

标签: android c++ exception android-ndk new-operator


【解决方案1】:

我下载了 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。

【讨论】:

    【解决方案2】:

    我认为 Android 不支持异常。如果最近更改了此内容,您可以发布指向您的参考文章的链接吗?我的印象是使用 new 运算符分配失败将在 Android 上返回一个空指针。

    在这种情况下,如果您在终端上使用(nothrow),您应该遵守它们的默认分配行为并在 Android 上获得与预期相同的结果。

    http://www.cplusplus.com/reference/std/new/nothrow/

    【讨论】:

    • 我其实不记得了,但我在搜索时发现了这个:crystax.net/android/ndk-r5.php
    • 啊,这似乎是 google NDK 的本土实现,并且默认情况下,google NDK 编译时没有例外。您必须使用 -fexceptions 重新编译整个 NDK 才能启用它们。但是,我会非常警惕它对 STL 和标准 C++ 异常的支持程度。我仍然建议使用 (nothrow) 来避免整个混乱,因为 Android 在设计时并没有考虑到例外情况。
    • 好的,我下载了 ndk 并找到了关于此事的文档。不幸的是不允许回答我自己的问题,但据我了解,使用 -fexceptions 编译的代码支持异常,而无需重新编译整个 ndk。但是 STL 实现是使用 -fnoexceptions 编译的。这对我来说都是好消息,因为我有想要移植到 Android 的现有代码。
    • 仅供参考,您可以回答自己的问题......这里支持自我学习和分享您的发现。有时最好的答案是你自己想出来的。
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2012-03-29
    • 2013-06-05
    • 2013-12-05
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多