Por que no hay fallo de segmento en este codigo?

Iniciado por digimikeh, 29 Octubre 2020, 01:29 AM

0 Miembros y 1 Visitante están viendo este tema.

digimikeh

buenas...

Me pregunto por qué no hay fallo de segmentacion (o indice fuera de rango en el vector) en el siguiente codigo..:

Código (cpp) [Seleccionar]

#include <iostream>
#include <vector>

class alpha{
private: 
    int x {0};
public:
    alpha(const int _x) : x{_x}{}
};

int main(){
    std::vector<alpha*> vA;
    for (int m{0}; m != 2; ++m) vA.push_back(nullptr);
   
    vA[0] = new alpha(0);   //OK
    vA[1] = new alpha(1);   //OK
    vA[2] = new alpha(2);   //Aqui debe arrojar un error de subscript fuera de rango..
   
    return 0;
 
}


La duda me vino ya que estoy desrarollando un programa en Qt Creator, estoy usando GCC pero ahi nunca me arrojó un error, luego probé compilar en windows con msvc y ahi me arrojo el error, luego al revisar el codigo encontré sentido que arrojara el error porque realmente la linea vA[2] esta fuera de rango, no hay nullptr empujado en el vector en ese indice.... pero GCC lo acepto de todas formas.. no comprendo por qué

saludos.!
gracias.

Dungeons & dragons;
dragons.Attack();

AlbertoBSD

Un vector es como un arreglo fijo, pero tienen muchas diferencias si lees un poco sobre los mismos encontraras que

CitarInstead, vector containers may allocate some extra storage to accommodate for possible growth, and thus the container may have an actual capacity greater than the storage strictly needed to contain its elements (i.e., its size). Libraries can implement different strategies for growth to balance between memory usage and reallocations, but in any case, reallocations should only happen at logarithmically growing intervals of size so that the insertion of individual elements at the end of the vector can be provided with amortized constant time complexity (see push_back).

Sigue probando mas index a ver hasta donde llega, tiene que marcar segment fault en algun punto.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Loretz

El operador [] en vector no chequea la condición de out of range, y el estándar define esta situación como "undefined behavior", que es la forma que tiene de decir: no lo hagas, puede suceder cualquier cosa (algo malo, o peor: nada).

El Visual Studio hace una comprobación en modo debug, aunque no lo comprueba en modo release.

Una práctica más higiénica recomienda usar std::vector::at()

digimikeh

Dungeons & dragons;
dragons.Attack();