elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Por que no hay fallo de segmento en este codigo?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Por que no hay fallo de segmento en este codigo?  (Leído 2,457 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Por que no hay fallo de segmento en este codigo?
« 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.



En línea

Dungeons & dragons;
dragons.Attack();
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Por que no hay fallo de segmento en este codigo?
« Respuesta #1 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!


En línea

Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Por que no hay fallo de segmento en este codigo?
« Respuesta #2 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()
En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Por que no hay fallo de segmento en este codigo?
« Respuesta #3 en: 29 Octubre 2020, 03:17 am »

Me queda claro.. muchas gracias
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines