Mac下Homebrew的g++-13未触发std::out_of_range捕获,出现zsh: abort
GCC编译后触发abort而非执行catch块的原因及解决办法
Homebrew安装的g++-13默认启用了_GLIBCXX_ASSERTIONS编译宏,这个宏会让GCC配套的libstdc++标准库在检测到std::out_of_range这类非法操作时,直接调用abort()终止程序,跳过异常抛出流程,自然也就不会执行你的catch块代码。
而Apple Clang别名的g++使用的是LLVM的libc标准库,它默认没有启用这类强制终止的断言机制,所以会按照C标准正常抛出std::out_of_range异常,被catch块捕获后输出预期内容。
让g++-13正常抛出异常的方法
- 编译时显式关闭该断言:
g++-13 -U_GLIBCXX_ASSERTIONS your_source.cpp -o output_bin - 或者在代码中包含标准库头文件前取消宏定义:
#undef _GLIBCXX_ASSERTIONS #include <vector> // 其他头文件和代码
额外说明
_GLIBCXX_ASSERTIONS是GCC为提升代码安全性默认开启的选项,除了容器越界,像std::string::at()这类操作触发的越界也会直接abort。而libc++的类似断言机制需要手动通过_LIBCPP_ENABLE_ASSERTIONS宏启用,默认是关闭状态。
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

