std::map 第一次迭代出错 运行

std::map iteration turns wrong on first run

我有一个 std::map 来存储指向与其各自 ID 关联的对象的指针。当我在地图上循环获取它的内容时,第一次尝试时我得到了错误的 return,但在接下来的尝试中得到了正确的:

class session_list {
private:
    ...
  static std::map<uint, session*> session_list;
    ...
public:
    ...
  static void add_exclusive_session(uint id, session& session);
    ...
  std::map<uint, session*>& get_session_list() ;
};
std::map<uint, core_base_session*>& core_session_list::get_session_list() {
    return session_list;
}

void session_list::add_exclusive_session(uint id, session& session) {
    guard g(mutex);
    if (session.disconnect_reason != core_sd_connected)
         return;
    session * previous_session = get_session(id, g);
    session_list.emplace(id, &session);
    if ((previous_session != nullptr)
        &&(previous_session != &session)) {
    previous_session->disconnect(core_sd_peer_duplicated);
  }
}
std::map<uint, session*> session_list =
    session.parent.session_list->get_session_list();
for ( auto& it: session_list) {
    printf("\n\tSESSION N° %d \t %p" , it.first, it.second);
}

它转储这个:

2016-08-18 14:57:23.103881 [info] DBG_

        SESSION N° 1402969504    0x7efc400008c0 <=== APPEARS TWICE
        SESSION N° 574745422     0x1a469f0
        SESSION N° 1402969504    0x7efc400008c0 <=== APPEARS TWICE
        SESSION N° 1502939797    0x7efc48000ca0
        SESSION N° 1510611043    0x7efc3c000ca0
2016-08-18 14:57:38.245280 [info] DBG_

        SESSION N° 2011917896    0x7efc44000ca0 <=== APPEARS NOT ON FIRST TRY
        SESSION N° 574745422     0x1a469f0
        SESSION N° 1402969504    0x7efc400008c0
        SESSION N° 1502939797    0x7efc48000ca0
        SESSION N° 1510611043    0x7efc3c000ca0

有什么想法吗?

所以我们在这里看到的是 std::map 对象包含两个相同的键。让我们列举可以解释这种行为的可能性(从最不可能到最可能):

  • 您的编译器的 std::map 根本损坏并允许多个相同的键;
  • 你的代码中某处有一个未定义的行为会破坏 session_list;
  • 第一个 SESSION N° 行序列是由相关代码多次执行产生的,例如

    # run 1
    SESSION N° 1402969504    0x7efc400008c0 <=== APPEARS TWICE
    # run 2
    SESSION N° 574745422     0x1a469f0
    SESSION N° 1402969504    0x7efc400008c0 <=== APPEARS TWICE
    SESSION N° 1502939797    0x7efc48000ca0
    SESSION N° 1510611043    0x7efc3c000ca0
    

我的钱在最后一个。如果没有看到您的更多代码,很难判断它的可能性有多大。