私はstd::function
のリストを持っています。1つのイテレータによって参照されるオブジェクトは、他の人によって消去されました
リストを反復すると、関数が呼び出され、場合によっては関数呼び出しで削除されることがあります。この場合、イテレータが既存の要素を指していないため、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呼び出す可能性があります。
現在、回避策は++とit-- around msg_handler callです。
for (std::list<MessageCallback>::iterator it = _msg_callbacks.begin(); it != _msg_callbacks.end(); ++it) {
if (-1 == msg_type || msg_type == it->_msg_type) {
if (-1 == msg_id || response_msg_id == it->_msg_id) {
it->_msg_handler(msg_type, msg_id, data);
}
}
// some case to remove the function
it = _msg_callbacks.erase(it);
}
cppreference.comからstd::list::erase上:ここ
はあなたがerase
を使用して、その戻り値を使用してループを継続することができ、コード
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'をチェックするべきではないと思います –