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

在C++类中调用std::vector::push_back时触发_ZSt28__throw_bad_array_new_lengthv入口点缺失错误的求助

解决std::vector::push_back触发"_ZSt28__throw_bad_array_new_lengthv"入口点缺失错误

我来帮你捋清楚这个问题——这个错误和std::vector的容器逻辑本身没啥关系,核心是编译与运行时的C++标准库链接不兼容导致的。

先拆解下错误提示:_ZSt28__throw_bad_array_new_lengthv是GCC的libstdc标准库中,负责抛出std::bad_array_new_length异常的函数符号,这个符号是在GCC 5及以上版本中新增的。程序运行时找不到这个入口点,本质是你编译时用的GCC版本,和系统运行时加载的libstdc动态库版本不匹配,或者编译选项导致标准库链接不完整。

为什么push_back会触发这个错误?

其实不是push_back直接引发的——std::vector的动态扩容逻辑本身不会平白无故触发这个异常。问题出在程序启动或标准库初始化阶段,当调用到依赖该符号的内存分配相关代码时,就会抛出链接错误,刚好在你调用push_back的时候暴露出来而已。

针对你的场景的解决方案

结合你在Windows下用g++编译的情况,试试下面几个步骤:

  • 指定C++标准版本编译
    你的代码用到了C++11及以后的特性(比如列表初始化{startCursor, endCursor}),编译时明确指定标准版本,避免编译器默认用旧标准导致兼容性问题:

    g++ -std=c++11 test.cpp lib/cursor.cpp lib/lexer.cpp -o test.exe
    
  • 静态链接标准库
    Windows下常出现系统自带的libstdc动态库版本过旧的问题,直接静态链接libstdc可以彻底避开这个问题:

    g++ -std=c++11 -static-libstdc++ test.cpp lib/cursor.cpp lib/lexer.cpp -o test.exe
    

    这个选项会把libstdc++的代码打包到你的exe里,运行时不再依赖系统的动态库。

  • 检查GCC版本一致性
    确认编译用的g版本,和系统中存在的libstdc版本匹配。用g++ --version查看编译器版本,然后检查系统PATH中优先加载的libstdc++-6.dll是否为对应版本(如果是MinGW环境,这个dll通常在MinGW的bin目录下,确保该目录在PATH最前面)。

额外代码检查(排除潜在逻辑问题)

虽然这个错误不是代码逻辑导致的,但还是提一下:你的Cursor构造函数直接调用了i.at(0),如果传入空字符串会触发std::out_of_range异常,但你的测试输入是有效的,所以这不是当前问题的原因。另外Lexer中的cursorStack是std::vector<std::vector<Cursor>>,默认的拷贝构造函数可以正常工作,不需要额外处理。

按照上面的步骤修改编译命令,应该就能解决这个运行时链接错误了。

内容的提问来源于stack exchange,提问作者ghsoares

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:57:38