我在STL库中遇到Mac OS X Lion(gcc 4.6.4)上的C ++程序的EXC_BAD_ACCESS问题。我管理了一组指针:std :: set,“symbols”是一个类,由于我不理解的原因,程序最终在尝试插入集合时崩溃(我可以做很多插入和擦除之前)。 GDB提供以下内容:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: 13 at address: 0x0000000000000000
0x0000000100003a79 in std::less<symbols*>::operator() (this=0x1002013e8, __x=@0x7fff5fbff240, __y=@0x3000100201400) at stl_function.h:236
236 { return __x < __y; }
(gdb) backtrace
#0 0x0000000100003a79 in std::less<symbols*>::operator() (this=0x1002013e8, __x=@0x7fff5fbff240, __y=@0x3000100201400) at stl_function.h:236
#1 0x0000000100003162 in std::_Rb_tree<symbols*, symbols*, std::_Identity<symbols*>, std::less<symbols*>, std::allocator<symbols*> >::_M_insert_unique (this=0x1002013e8, __v=@0x7fff5fbff240) at stl_tree.h:1277
#2 0x0000000100002cc3 in std::set<symbols*, std::less<symbols*>, std::allocator<symbols*> >::insert (this=0x1002013e8, __x=@0x7fff5fbff240) at stl_set.h:410
我不明白为什么这个std :: less函数会崩溃:它只是做一个指针比较......
我已经跟踪了对这个std :: less :: operator()函数的所有调用;从我理解的插入/删除集合时,有几个调用将输入值与参考值(可能是RB树节点中的参考值)进行比较,并且当使用此0x3000100201400值时,总会发生崩溃的std ::少。这是我唯一的线索。有什么想法吗?
谢谢
编辑:我补充说代码在Ubuntu上正常运行。其他的东西:我用std :: list替换了std :: set并用push_back / remove替换了insert / erase,我也得到了一个EXC_BAD_ACCESS(当然callstack是不同的但是它仍然涉及到插入相同的指针结构)。