我不得不分享这个:
由于以下涉及条件运算符的琐碎错误,我被挂断了整整 2 天。
这是一个简单的更正,但我想知道:
- 为什么错误的代码会编译?
- 虫子在做什么?
- 为什么追查这么难?
错误代码:
std::map<int, some_class> my_map;
int key_ctr = 0;
//...
std::map<int, some_class>::iterator it_next =
key_ctr == 0 ?
it_next = my_map.begin() // BUG!!!
:
it_next = --my_map.end(); // BUG!!!!
// .....
显然,我写错了条件运算符。当我终于找到并纠正了这个错误时,一切都很好:
正确的代码:
std::map<int, some_class> my_map;
int key_ctr = 0;
//...
std::map<int, some_class>::iterator it_next =
key_ctr == 0 ?
my_map.begin() // CORRECTED!
:
--my_map.end(); // CORRECTED!
我的程序在接近错误部分时刚刚挂起 - 就好像它处于无限循环中。当我用valgrind运行它时,我得到了类似的东西
....
==24570== Warning: set address range perms: large range [0x1a7731000, 0x1c5f79000) (defined)
==24570== Warning: set address range perms: large range [0x1c5f79000, 0x1e47c1000) (defined)
==24570== Warning: set address range perms: large range [0x1e47c1000, 0x203009000) (defined)
==24570== Warning: set address range perms: large range [0x203009000, 0x221851000) (defined)
.....
==3733== More than 10000000 total errors detected. I'm not reporting any more.
这完全没有帮助,并把我指向了错误的导演(我以为我在堆上分配了太多,不知何故)。
再次,
- 为什么错误的代码会编译?
- 虫子在做什么?
- 为什么追查这么难?
谢谢孩子们。