You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 16:42:09