背景:以前做的一个功能,在程序中保存了一个map,这个map的类型是这样的: std::map<int, std::set<自定义类型>>,一般情况下这个 set 只有一个元素,特殊情况是允许set有两个元素。现在是项目测试发现一个问题,似乎跟这个功能有关,底层说可能是我们这个上层的问题,于是开始自测。之前写过一篇 map operator[] 的文章,这里
如下这是一个特殊情况下的map,这个 set 里就有 2 个元素:
怀疑点是在删除元素时没有从 map 删掉,所以只能从 gdb 里看这个 map 信息了,然后我操作删除所有元素,再查看一下这个 map 的情况,如:
因为我知道 map 的 key,所以我就直接输入 xx_mset[80041],看结果这个 set 里是没有元素的,然后我又想直接打印整个 map,输入p xx_mset,结果吓我一跳,因为还有一个元素在呢,怎么没有删除掉呢?我还去把代码看了一遍,搞不好还是一个 bug 呢.......结果看代码也没发现问题啊,然后又重新来一遍,gdb 打断点一步步看,结果删除是正常的啊,怎么还有一个没有删除呢?如果真的是这样会有问题的,当时真的以为是一个bug,只是目前没有发现而已。
最后发现是 key 不一样,原来 map 里的是 800041,而我输入的是 80041,删除后 map 里的 800041 确实都删除掉了,是正常的,而多出来的 这个_M_s = std::map with 1 element = {
[80041] = std::set with 0 elements
是因为 p xx_mset[80041] (本意是要打印 map 的一个元素的)这一句导致新插入了一个元素, 真是吓一跳。