一个简单的vector.push_back()会在我的代码中导致一些错误:
#include <vector> using namespace std; int main(int argc,const char *argv[]) { vector<unsigned> stack; stack.push_back(1); stack.push_back(1); //stack.size() becomes 467369971 after this stack.push_back(1); stack.push_back(1); ... more push_back()s ... return 0; }
我正在使用GDB来检查它的行为……而奇怪的是,在第二个push_back()之后,stack.size()出错了.变成467369971!可能有什么不对?我在Win7 64位上运行,而我正在使用MinGW和G 4.7.0
以下是GDB的输出:
(gdb) n 5 std::vector<unsigned> sta (gdb) n 6 stack.push_back(1); (gdb) display stack.size() 1: stack.size() = 0 (gdb) n 7 stack.push_back(1); 1: stack.size() = 1 (gdb) 8 stack.push_back(1); 1: stack.size() = 467369971 //goes wrong here (gdb) 9 stack.push_back(1); 1: stack.size() = 467369971 (gdb) 10 stack.push_back(1); 1: stack.size() = 4 // gets "normal" (gdb) 11 stack.push_back(1); 1: stack.size() = 467369971 // wrong again (gdb) 12 stack.push_back(1); 1: stack.size() = 6 (gdb) 13 stack.push_back(1); 1: stack.size() = 7 (gdb) 14 stack.push_back(1); 1: stack.size() = 8 (gdb) 15 stack.push_back(1); 1: stack.size() = 467369971 (gdb) 16 stack.push_back(1); 1: stack.size() = 10 (gdb) 17 stack.push_back(1); 1: stack.size() = 11 (gdb) 18 stack.push_back(1); 1: stack.size() = 12 (gdb) 19 return 0;
解决方法
What may be wrong?
这是编译器或GDB中的错误.它不能在Linux上使用g(Ubuntu 4.4.3-4ubuntu5.1)4.4.3和GDB 7.4重现:
(gdb) n 7 stack.push_back(1); 1: stack.size() = 0 (gdb) 8 stack.push_back(1); //stack.size() becomes 467369971 after this 1: stack.size() = 1 (gdb) 9 stack.push_back(1); 1: stack.size() = 2 (gdb) 10 stack.push_back(1); 1: stack.size() = 3 (gdb) 11 stack.push_back(1); 1: stack.size() = 4 (gdb) 12 stack.push_back(1); //stack.size() becomes 467369971 after this 1: stack.size() = 5 (gdb) 13 stack.push_back(1); 1: stack.size() = 6 (gdb) 14 stack.push_back(1); 1: stack.size() = 7 (gdb) 15 return 0; 1: stack.size() = 8 (gdb) 16 } (gdb) q
不幸的是,弄清楚哪个工具应该归咎于这将有点困难:你需要检查生成的debuginfo.相反,您可能会尝试使用不同版本的GCC和GDB重现问题.如果变化的GCC导致bug消失,那么它可能是GCC中的一个错误.如果不同的GDB版本使bug消失,那可能是GDB错误.