我有一個列表std::function
。由一個迭代器引用的對象已被其他對象擦除
迭代列表時,該函數將被調用,並且在某些情況下,它將在函數調用中被刪除。在這種情況下,當在for循環中遞增迭代器時發生崩潰,因爲迭代器指向不存在的元素。
這裏是我的代碼:
for (std::list<MessageCallback>::iterator it = _msg_callbacks.begin(); it != _msg_callbacks.end(); ++it) {
if (-1 == it->msg_type || msg_type == it->_msg_type) {
if (-1 == it->msg_id || response_msg_id == it->_msg_id) {
it->_msg_handler(msg_type, msg_id, data);
}
}
}
用戶定義msg_handler可能remove_callback在其中調用回調會被其他迭代器被刪除。
當前解決方法是將它添加到++以及它周圍的msg_handler調用中。
這裏是代碼
for (std::list<MessageCallback>::iterator it = _msg_callbacks.begin(); it != _msg_callbacks.end(); ++it) {
if (-1 == it->msg_type || msg_type == it->_msg_type) {
if (-1 == it->msg_id || response_msg_id == it->_msg_id) {
std::function<...> handle = it->_msg_handler(msg_type, msg_id, data);
it++;
handle(msg_type, msg_id, data);
it--;
}
}
}
你的'msg_type'和'msg_id'在哪裏? –
@appleapple MSG_TYPE和MSG_ID傳遞的功能參數 – gonglong
(未回答),但比我想你不應該檢查'-1 == msg_type'內環路 –