unordered_map 查得到却取错值,一次静态 lambda 的内存事故
有一种 C++ 问题特别容易把人带偏:unordered_map::find 明明命中了,it->first 也对,可你再看 it->second 里面的字段,像是变成了另一个 key 的数据。
第一反应通常是怀疑 map 坏了,或者 hash 冲突把数据弄乱了。可 unordered_map 没那么玄。查找命中以后,key 和 value 对不上,更常见的原因不是容器失灵,而是你在更新 value 的时候已经写错了地方。
这篇记录的坑,就是函数内部的 static lambda 捕获了局部引用。第一轮看不出来,后面再调用时,lambda 还握着第一次调用留下的引用,问题就开始变得像“缓存串号”。