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
我的钱在最后一个。如果没有看到您的更多代码,很难判断它的可能性有多大。
我有一个 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
我的钱在最后一个。如果没有看到您的更多代码,很难判断它的可能性有多大。