C++ · Intermediário · Português · Técnico
invalidação de iteradores
Situação em que uma operação no contêiner, como push_back em um vector, torna iteradores, ponteiros ou referências a elementos inválidos. Usá-los depois é comportamento indefinido.
Onde usar
Bug clássico: guardar um iterador ou referência para v[0], inserir mais elementos e a realocação deixar o valor guardado apontando para memória liberada. A documentação lista as regras de cada contêiner.
Em código
std::vector<int> v{1, 2, 3};
auto it = v.begin();
v.push_back(4); // pode realocar
// *it aqui é comportamento indefinido
it = v.begin(); // pegue de novoExemplos
Esse push_back no laço invalida o iterador.
Reserve antes para evitar a invalidação de iteradores.
Cuidado
Em um laço com erase, o iterador apagado fica inválido; use o valor devolvido por erase como próximo iterador.