我必须分享这个:
我在以下条件运算符的微不足道错误上卡了整整两天。
这是一个简单的修正,但我想知道:
- 为什么有错的代码编译通过了?
- 这个错误在做什么?
- 为什么这么难以追踪到它?
有错的代码:
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.
这完全没有帮到我,反而让我误入歧途(我以为是堆上分配了太多内存)。
再次提醒:
- 为什么有错误的代码还能编译通过?
- 错误代码在做什么?
- 为什么这个错误难以追踪?
谢谢。