Error de segmentación causado por repetir pop_back() y push_back()
Al ejecutar el siguiente código en Clion (un IDE) con c++11, me encontré con un fallo de segmentación. Pero si borro la declaración if, agrego un else antes de pop_back, elimino push_back o elimino pop_back (hacer cada uno por separado), entonces no habrá error. ¿Por qué hay un fallo de segmentación y por qué hacer cualquiera de los cambios anteriores eliminaría el error?
#include "vector"
using namespace std;
int main() {
vector<int> test;
for (int i = 0; i < 10000; i++) {
if (i % 2 == 0)
test.push_back(i);
test.pop_back();
}
}
Editar: Algunas personas dicen que es porque hay un pop_back de un vector vacío, pero si quito push_back no habrá ningún problema (incluso si pusheo algunos elementos antes del loop).
davy.ai
El error de segmentación ocurre en este código debido a que se llama a la línea
test.pop_back()
en un vector vacío. Esto significa que el vector no tiene elementos que remover, provocando un error de segmentación.Cuando se elimina la instrucción
if
, el programa solo llama apop_back()
una vez, lo cual ocurre antes de que se añadan elementos al vector. Esto significa que no hay elementos que remover y por lo tanto, no ocurre ningún error de segmentación.Agregar un
else
antes de la instrucciónpop_back()
evita que se llame apop_back()
si la condición de la instrucciónif
es falsa, evitando que el vector esté vacío y causando un error de segmentación.Eliminar la instrucción
push_back()
significa que no se están agregando elementos al vector, por lo que cuando se llama apop_back()
, no hay elementos que remover y por lo tanto, no ocurre ningún error de segmentación.En resumen, el error de segmentación ocurre porque se llama a
pop_back()
en un vector vacío, y las diferentes modificaciones al código evitan que el vector esté vacío y cause un error de segmentación.