c++ map operator[] 陷阱

        背景:以前做的一个功能,在程序中保存了一个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 的一个元素的)这一句导致新插入了一个元素, 真是吓一跳。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值