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 的一个元素的)这一句导致新插入了一个元素, 真是吓一跳。

相关推荐

  1. C语言词法陷阱

    2024-07-16 23:42:04       50 阅读
  2. 128陷阱详解

    2024-07-16 23:42:04       19 阅读
  3. C陷阱和缺陷--第一章 “词法陷阱

    2024-07-16 23:42:04       40 阅读
  4. react的闭包陷阱

    2024-07-16 23:42:04       33 阅读
  5. 【WinForms 窗体】常见的“陷阱

    2024-07-16 23:42:04       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 23:42:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 23:42:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 23:42:04       58 阅读
  4. Python语言-面向对象

    2024-07-16 23:42:04       69 阅读

热门阅读

  1. 如何检查对象中键是否存在?

    2024-07-16 23:42:04       22 阅读
  2. 【嵌入式】面试笔试问题整理 (持续更新)

    2024-07-16 23:42:04       22 阅读
  3. 微信小程序-组件通信

    2024-07-16 23:42:04       19 阅读
  4. 【C语言实现双向循环链表】

    2024-07-16 23:42:04       22 阅读
  5. 前端面试题日常练-day88 【面试题】

    2024-07-16 23:42:04       18 阅读
  6. flex主轴元素控制优先级

    2024-07-16 23:42:04       18 阅读
  7. 从零开始学C语言第五天(练习)

    2024-07-16 23:42:04       22 阅读