在C++类中调用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

