Error "double free or corruption"

Error "double free or corruption"

de Baltasar Seijas Bozzo -
Número de respuestas: 2

Buenas, haciendo uno de los ejercicios, queriendo borrar todos los elementos de una lista después de cierto elemento(en este caso después de aux2) se me ocurrió este esquema pero al hacerlo me salta el error  "double free or corruption".


Luego descubrí otra ruta para solucionar el ejercicio pero quería saber porque esto da un error y cómo sería una buena forma de resolver el problema de borrar todos los elementos después de cierto elemento. Muchas gracias. 


En respuesta a Baltasar Seijas Bozzo

Re: Error "double free or corruption"

de Baltasar Seijas Bozzo -
Ya descubri que el problema es que delete te deja basura y no null y lo pude solucionar
En respuesta a Baltasar Seijas Bozzo

Re: Error "double free or corruption"

de Federico Andrade -
Hola Baltasar,
En primer lugar me parece muy bueno esto que haces de no solo resuelvas los ejercicios, sino también que los pruebes como hiciste :)
Sobre la lógica del código, parece correcto. Lo que puede estar pasando es o bien que el último aux3->sig no está bien inicializado y no apunta a NULL o bien que luego del delete del primero, el anterior queda apuntando a basura. Lo que se recomienda es que tras un delete, las refrencias que apuntaban a dicho nodo queden consistentes a la representación, principalmente si eso se va a seguir usando.
Nuevamente, sobre la lógica, si bien parece correcta, tenés una doble iteración cuando lo podrías resolver con una sola. Los while anidados hacen que la lista se recorra dos veces (no completa porque se van eliminando elementos en cada paso), pero podrías hacerlo un poco más eficiente con una única recorrida, el pseudocódigo sería:

- while aux ->sig distino de NULL (me fijo si no estoy en el último nodo)
-- nodo_a_eliminar = aux->sig (con un puntero auxiliar apunto al próximo nodo)
-- aux->sig = nodo_a_eliminar->sig (hago que el siguiente de aux sea el siguiente del siguiente - perdón por el trabalenguas. Eso hace que el nodo que se va a borrar quede "desenganchado" de la lista)
-- delete nodo_a_eliminar (elimino el nodo que quería eliminar)

Saludos