ExpertiDict

C++ · Intermediário · Português · Técnico

invalidação de iteradores

ĩvalidaˈsɐ̃w̃ dʒi iteɾaˈdoɾissubstantivo

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 novo

Exemplos

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.

Veja também

Todos os termos de C++