使用-fno-exceptions编译时调用C++17并行算法报bad_alloc错误如何解决
结论
是的,在未做任何修改的情况下使用GCC 11.2自带的libstdc++ C++17并行算法,必须开启异常支持。
报错原因
C标准规定,并行算法执行过程中如果出现异常(包括内部内存分配抛出的std::bad_alloc、用户传入的可调用对象抛出的自定义异常),实现必须捕获所有未处理异常并调用std::terminate终止程序。GCC 11.2的libstdc并行算法实现中,直接内置了对应catch块来处理上述异常场景,哪怕你的业务代码完全不会抛出异常,这些标准库内置的catch代码仍然存在。当你开启-fno-exceptions编译选项时,编译器会禁止处理所有try/catch语法,因此会命中你看到的报错。
替代方案(不需要全局开启异常)
如果你的业务场景不允许全局开启异常,可以选择以下方案规避:
- 局部开启异常:仅给调用了并行算法的编译单元添加
-fexceptions编译选项,其余业务代码仍然保留-fno-exceptions。这种方案下你的业务代码不会产生异常开销,仅允许编译器处理标准库内部的异常处理逻辑,运行时不会有额外负担。 - 替换并行算法实现:放弃使用标准库的C++17并行算法,改用兼容无异常场景的并行实现,比如OpenMP并行封装、Intel TBB的并行算法接口,这类实现本身不依赖异常机制,可在
-fno-exceptions下正常编译运行。 - 升级编译器:如果可以升级到GCC 12及以上版本,libstdc++新增了非标准的无异常并行算法编译配置,可在不开异常的情况下使用并行算法,不过该功能属于平台扩展,跨平台兼容性较差。
内容的提问来源于stack exchange,提问作者Jane Doe
相关产品推荐
相关产品推荐

