Non sono sicuro di cosa c'è di sbagliato con questo codice:Perché la chiamata a std :: vector :: back() in crash il mio programma
std::vector<int> myVector(0);
if (myVector.back() == 12)
myVector.push_back(12);
Sembra che richiamare() su un vettore vuoto si blocca il programma.
Non capisco perché si blocca? Dobbiamo controllare la lunghezza del vettore prima di chiamare back()
? o è possibile che si tratti di un bug?
La documentazione dice che se il vettore è vuoto restituisce un valore non definito.
Sospetto che importi qualcuno che ti dà -1 per l'utilizzo di MSDN come riferimento invece dello standard C++. Gli implementatori sono autorizzati a definire ulteriormente cosa fa la loro implementazione nei casi in cui lo standard dice UB, quindi se MS vuole garantire che 'back()' ritornerà quando usato su un vettore vuoto, hanno il diritto di farlo. Se stai usando MSVC++ hai diritto a leggere la loro documentazione. Ma potrebbe invece essere -1 per non rendersi conto che l'utilizzo di un "valore non definito" in qualsiasi modo, può causare un arresto anomalo. –
@SteveJessop Penso che MSDN sia l'implementazione dello standard C++. Ma è strano che chiamare un metodo su un elemento valido (per quanto io sappia che un vettore vuoto è un elemento valido) causa il crash del mio programma. Bene, se lo standard dice così, così sia :) – MBen
MSVC++ è * un * implementazione di (circa) lo standard C++. Altre implementazioni si comportano diversamente, se lo standard non indica il comportamento. Il motivo per cui lo standard non definisce la chiamata di 'back()' su un vettore vuoto è che le implementazioni non hanno bisogno di codice di caso speciale per questo. Possono quindi scegliere di essere più veloci di quanto sarebbero se dovessero controllare se il vettore fosse vuoto o meno, e fare cose diverse in casi diversi. Saranno inclini a schiantarsi (o peggio) quando farai qualcosa di sbagliato. Può sembrare strano, ma è un compromesso fatto come parte del design della lingua. –