2013-05-18 20 views
10

Ho un std::vector. Controllo la sua dimensione che è 6 ma quando provo ad accedere a vec[6] per verificare se darà errore, non ottengo alcun errore ma un numero invece. Non dovrebbe dare un errore?Vector andando fuori dai limiti senza dare l'errore

edit: qualcosa di simile:

struct Element 
{ 
    std::vector<double> face; 
}; 

int main() 
{ 
    Element elm; 

    .... // insert 6 elements into elm.face 

    std::cout << elm.face.size() << std::endl; // answer is 6 
    std::cout << elm.face[6] << std::endl; // answer is some number 
} 
+1

dimensioni 6, quindi l'ultimo è 'vec [5]' inizia con 0 – Bill

+1

Non sai da dove ti sia venuta l'idea che 'vector' genererebbe un errore su un indice non valido usando' operator [] '. I documenti sicuramente dicono il contrario. –

+0

'Si noti che il primo elemento ha una posizione di 0 (non 1) .' - http://www.cplusplus.com/reference/vector/vector/operator[]/ – Bill

risposta

27

I vettori STL eseguono il controllo dei limiti quando viene chiamata la funzione membro .at(), ma do not perform any checks on the [] operator.

In caso di fuori limite, l'operatore [] produce risultati non definiti.

+7

Il comportamento non è definito, quindi le implementazioni sono ** consentite ** per introdurre controlli dei limiti; la differenza da 'at' è che i controlli sui limiti sono ** richiesti ** per' at'. –

3

E 'un comportamento indefinito. Un comportamento indefinito non significa necessariamente che si verificherà un errore: è possibile che lo sia, ma si potrebbe ottenere invece un risultato che non ha molto senso.

-1

Le strutture dati sono indicizzate a partire da 0, quindi se si sta accedendo a vec [6], questo sarà fuori limite. Probabilmente non ricevi un errore a causa di un problema di memoria; potrebbe esserci qualcosa dal codice precedente che hai eseguito, o qualche errore simile. Si prega di inviare il codice.

7

Come indicato nella risposta di kgraney, questo è un comportamento non definito. Tuttavia, la maggior parte delle librerie C++ ha alcune possibilità di abortire o sollevare un'eccezione in questi casi. Solitamente controllato impostando o disattivando specifiche macro del compilatore.

mi hanno fatto una panoramica della documentazione rilevante:

gnu libstdC++

clang libcxx

spinta

Microsoft

Nota che GNU e clang disabilitare i controlli di default, mentre Microsoft li ha abilitato per impostazione predefinita. Se non si è a conoscenza di ciò, il codice potrebbe essere notevolmente più lento in modalità di debug su un sistema Microsoft.

+0

... potrebbe funzionare molto più lentamente * in modalità debug * su un sistema Microsoft. – legalize

Problemi correlati