Questo comportamento non è definito, il che significa che può accadere qualsiasi cosa, incluso segfault, o ciò che si è verificato o qualsiasi altra cosa. Fondamentalmente, eri solo fortunato che non si è schiantato (o sfortunato, in base al punto di vista).
La lingua non richiede la verifica degli accessi iteratore, poiché ciò richiederebbe un controllo in fase di esecuzione. C++ di solito cerca di evitare inutili sovraccarichi di run-time, lasciando al programmatore la possibilità di eseguire qualsiasi controllo sia necessario.
La maggior parte delle piattaforme moderne utilizza la memoria virtuale a pagine, fornendo protezione della memoria con una granularità di alcuni kilobyte. Ciò significa che spesso c'è una memoria accessibile dopo un blocco assegnato (come quello gestito da std :: vector), nel qual caso gli accessi fuori dall'intervallo semplicemente calpesteranno quella memoria.
Visual Studio sta cercando di aiutare a rimuovere il codice pericoloso. In linea di principio un puntatore potrebbe puntare ovunque se non lo si deniteri, ma gli iteratori sono un'astrazione di livello superiore e hanno la capacità di rilevare se il dereferenziamento sarebbe valido e quindi aumentare gli errori di runtime. Visual Studio ha eseguito questa operazione con vector<T>::iterator
almeno dal VS 2007.
la responsabilità di mantenere l'iteratore all'interno dell'intervallo dipende interamente dal chiamante. –
Sì, questo è legale con un puntatore. Ma quello che hai è un iteratore. –
@AlexeyAndronov Lo standard dice che è un comportamento indefinito. Sia per gli iteratori che per i puntatori. –