Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: digimikeh en 29 Octubre 2020, 01:29 am



Título: Por que no hay fallo de segmento en este codigo?
Publicado por: digimikeh en 29 Octubre 2020, 01:29 am
buenas...

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

Código
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class alpha{
  5. private:  
  6.    int x {0};
  7. public:
  8.    alpha(const int _x) : x{_x}{}
  9. };
  10.  
  11. int main(){
  12.    std::vector<alpha*> vA;
  13.    for (int m{0}; m != 2; ++m) vA.push_back(nullptr);
  14.  
  15.    vA[0] = new alpha(0);   //OK
  16.    vA[1] = new alpha(1);   //OK
  17.    vA[2] = new alpha(2);   //Aqui debe arrojar un error de subscript fuera de rango..
  18.  
  19.    return 0;
  20.  
  21. }
  22.  

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.



Título: Re: Por que no hay fallo de segmento en este codigo?
Publicado por: AlbertoBSD en 29 Octubre 2020, 02:17 am
Un vector es como un arreglo fijo, pero tienen muchas diferencias si lees un poco sobre los mismos encontraras que

Citar
Instead, 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!


Título: Re: Por que no hay fallo de segmento en este codigo?
Publicado por: Loretz en 29 Octubre 2020, 02:39 am
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()


Título: Re: Por que no hay fallo de segmento en este codigo?
Publicado por: digimikeh en 29 Octubre 2020, 03:17 am
Me queda claro.. muchas gracias