背景

一个std::map 莫名其妙总是多了些元素。如下所示:

(gdb) p bsblock_map_
$2 = std::map with 466 elements = {[2] = std::shared_ptr (count 1, weak 0) 0x7f5420000a80, [1313131328] = std::shared_ptr (count 1, weak 0) 0x7f541c002ac0,
  [1313131329] = std::shared_ptr (count 1, weak 0) 0x7f5414000b00, [1313131340] = std::shared_ptr (count 1, weak 0) 0x7f5418000b00, [1313131341] = std::shared_ptr (count 202, weak 0) 0x7f540c000b00,
  [1313131342] = std::shared_ptr (empty) 0x0, [1313131343] = std::shared_ptr (empty) 0x0, [1313131344] = std::shared_ptr (empty) 0x0, [1313131345] = std::shared_ptr (empty) 0x0,
  [1313131346] = std::shared_ptr (empty) 0x0, [1313131347] = std::shared_ptr (empty) 0x0, [1313131348] = std::shared_ptr (empty) 0x0, [1313131349] = std::shared_ptr (empty) 0x0,
  [1313131350] = std::shared_ptr (empty) 0x0, [1313131351] = std::shared_ptr (empty) 0x0, [1313131352] = std::shared_ptr (empty) 0x0, [1313131353] = std::shared_ptr (empty) 0x0,
  [1313131354] = std::shared_ptr (empty) 0x0, [1313131355] = std::shared_ptr (empty) 0x0, [1313131356] = std::shared_ptr (empty) 0x0, [1313131357] = std::shared_ptr (empty) 0x0,
  [1313131358] = std::shared_ptr (empty) 0x0, [1313131359] = std::shared_ptr (empty) 0x0, [1313131360] = std::shared_ptr (empty) 0x0, [1313131361] = std::shared_ptr (empty) 0x0,
  [1313131362] = std::shared_ptr (empty) 0x0, [1313131363] = std::shared_ptr (empty) 0x0, [1313131364] = std::shared_ptr (empty) 0x0, [1313131365] = std::shared_ptr (empty) 0x0,
  [1313131366] = std::shared_ptr (empty) 0x0, [1313131367] = std::shared_ptr (empty) 0x0, [1313131368] = std::shared_ptr (empty) 0x0, [1313131369] = std::shared_ptr (empty) 0x0,
  [1313131370] = std::shared_ptr (empty) 0x0, [1313131371] = std::shared_ptr (empty) 0x0, [1313131372] = std::shared_ptr (empty) 0x0, [1313131373] = std::shared_ptr (empty) 0x0,
  [1313131374] = std::shared_ptr (empty) 0x0, [1313131375] = std::shared_ptr (empty) 0x0, [1313131376] = std::shared_ptr (empty) 0x0, [1313131377] = std::shared_ptr (empty) 0x0,
  [1313131378] = std::shared_ptr (empty) 0x0, [1313131379] = std::shared_ptr (empty) 0x0, [1313131380] = std::shared_ptr (empty) 0x0, [1313131381] = std::shared_ptr (empty) 0x0,
  [1313131382] = std::shared_ptr (empty) 0x0, [1313131383] = std::shared_ptr (empty) 0x0, [1313131384] = std::shared_ptr (empty) 0x0, [1313131385] = std::shared_ptr (empty) 0x0,
  [1313131386] = std::shared_ptr (empty) 0x0, [1313131387] = std::shared_ptr (empty) 0x0, [1313131388] = std::shared_ptr (empty) 0x0, [1313131389] = std::shared_ptr (empty) 0x0,
  [1313131390] = std::shared_ptr (empty) 0x0, [1313131391] = std::shared_ptr (empty) 0x0, [1313131392] = std::shared_ptr (empty) 0x0, [1313131393] = std::shared_ptr (empty) 0x0,
  [1313131394] = std::shared_ptr (empty) 0x0, [1313131395] = std::shared_ptr (empty) 0x0, [1313131396] = std::shared_ptr (empty) 0x0, [1313131397] = std::shared_ptr (empty) 0x0,
  [1313131398] = std::shared_ptr (empty) 0x0, [1313131399] = std::shared_ptr (empty) 0x0, [1313131400] = std::shared_ptr (empty) 0x0, [1313131401] = std::shared_ptr (empty) 0x0,
  [1313131402] = std::shared_ptr (empty) 0x0, [1313131403] = std::shared_ptr (empty) 0x0, [1313131404] = std::shared_ptr (empty) 0x0, [1313131405] = std::shared_ptr (empty) 0x0,
  [1313131406] = std::shared_ptr (empty) 0x0, [1313131407] = std::shared_ptr (empty) 0x0, [1313131408] = std::shared_ptr (empty) 0x0, [1313131409] = std::shared_ptr (empty) 0x0,
  [1313131410] = std::shared_ptr (empty) 0x0, [1313131411] = std::shared_ptr (empty) 0x0, [1313131412] = std::shared_ptr (empty) 0x0, [1313131413] = std::shared_ptr (empty) 0x0,
  [1313131414] = std::shared_ptr (empty) 0x0, [1313131415] = std::shared_ptr (empty) 0x0, [1313131416] = std::shared_ptr (empty) 0x0, [1313131417] = std::shared_ptr (empty) 0x0,
  [1313131418] = std::shared_ptr (empty) 0x0, [1313131419] = std::shared_ptr (empty) 0x0, [1313131420] = std::shared_ptr (empty) 0x0, [1313131421] = std::shared_ptr (empty) 0x0,
  [1313131422] = std::shared_ptr (empty) 0x0, [1313131423] = std::shared_ptr (empty) 0x0, [1313131424] = std::shared_ptr (empty) 0x0, [1313131425] = std::shared_ptr (empty) 0x0,
  [1313131426] = std::shared_ptr (empty) 0x0, [1313131427] = std::shared_ptr (empty) 0x0, [1313131428] = std::shared_ptr (empty) 0x0, [1313131429] = std::shared_ptr (empty) 0x0,
  [1313131430] = std::shared_ptr (empty) 0x0, [1313131431] = std::shared_ptr (empty) 0x0, [1313131432] = std::shared_ptr (empty) 0x0, [1313131433] = std::shared_ptr (empty) 0x0,
  [1313131434] = std::shared_ptr (empty) 0x0, [1313131435] = std::shared_ptr (empty) 0x0, [1313131436] = std::shared_ptr (empty) 0x0...}

分析

排查额外的std::map::insert 操作

排查额外的std::map::[] = 操作,没有

检查新增的元素类型

都是用 std::map::[] 查询时不存在的那些元素

查看std::map::[] 的说明

Access element
If k matches the key of an element in the container, the function returns a reference to its mapped value.

If k does not match the key of any element in the container, the function inserts a new element with that key and returns a reference to its mapped value. Notice that this always increases the container size by one, even if no mapped value is assigned to the element (the element is constructed using its default constructor).

A similar member function, map::at, has the same behavior when an element with the key exists, but throws an exception when it does not.

A call to this function is equivalent to:
(*((this->insert(make_pair(k,mapped_type()))).first)).second

总结

原来 std::map::[] 如果元素不存在,还会主动插入元素!!!!