2012-10-11 22 views
15

Tengo algunas dificultades para entender el comportamiento de la función clear de C++, cuando se aplica a un vector.vector :: clear en C++

traté de compilar y ejecutar la siguiente función:

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    unsigned int i; 
    vector<int> myvector; 
    myvector.push_back (1); 
    myvector.push_back (2); 
    myvector.push_back (3); 

    cout << "myvector contains:"; 
    for (i=0; i<myvector.size(); i++) cout << " " << myvector[i]; 

    myvector.clear(); 
    myvector.push_back (11); 
    myvector.push_back (12); 

    cout << "\nmyvector contains:"; 
    for (i=0; i<myvector.size(); i++) cout << " " << myvector[i]; 
    cout << endl; 

    cout << " entry3 = " << myvector[2]<<endl; 

    return 0; 
} 

Y esta es la salida:

myvector contains: 1 2 3 
myvector contains: 11 12 
entry3 = 3 

¿Cómo es posible que la información de la tercera entrada del vector no tiene borrado al borrar el vector?

+2

operador [] no valida la longitud del índice. Pruebe la misma operación con .at (n) y vea qué sucede. – WhozCraig

Respuesta

22

A partir de los documentos:

Todos los elementos del vector se dejan caer: sus destructores son llamados, y luego se retiran del recipiente de vector, dejando el recipiente con un tamaño de 0.

Básicamente está invocando comportamiento indefinido en myvector[2] porque ese elemento ya no existe. Solo presionó 2 elementos en el vector después de llamar al clear(), por lo que solo se puede acceder a los índices 0 y 1.

Tiene la mala suerte de que no se bloquee, porque aparecer trabajando puede ocultar errores. No hay garantía de que el valor se borre.

Intentar acceder al elemento con .at(2) dará lugar a una excepción (operator[]() no realiza ninguna comprobación encuadernada, mientras que at() sí).

7

Si intenta ejecutar este código en el modo debug, es probable que se bloquee con una afirmación de depuración. La referencia más allá del final de una matriz es comportamiento indefinido.

Lo que está sucediendo realmente es que el vector no ha borrado la memoria que estaba usando antes de ejecutar clear(). Esta memoria aún está presente, pero no está definido qué sucederá si accede a ella. Depende de usted realizar comprobaciones de límites para evitar correr al final de un vector. Puede hacerlo haciendo un bucle con size() como un límite, o usando at() y capturando la excepción out_of_range. No recomendaría particularmente este último enfoque, ya que no es una buena idea usar excepciones para verificaciones en tiempo de ejecución.