Ver Mensaje Individual
  #3 (permalink)  
Antiguo 08/10/2014, 09:12
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Guardar una lista en un fichero

Cita:
Iniciado por dehm Ver Mensaje
Finalmente parece que no se pueden hacer atajos, así que me resigno a leer el contenido de la lista e ir guardándolos uno a uno, e igualmente, volver a crear la lista e ir insertando los valores...
No se pueden coger atajos por una razón muy sencilla: Los contenedores de C++ gestionan internamente memoria dinámica para almacenar los elementos que se les vayan pasando. Debido a esto, si tu vuelcas directamente la memoria del contenedor lo que consigues es guardar punteros en vez de información útil.

De hecho, a modo de ejemplo, el único contenido que almacena directamente el objeto "list" usado por mi compilador es la siguiente:

Código C++:
Ver original
  1. _Nodeptr _Myhead;   // pointer to head node
  2. size_type _Mysize;  // number of elements

Es decir, un puntero a la lista de elementos y una variable que indica cuantos elementos tiene la lista... y eso es lo que vas a guardar en el fichero si lo haces a lo bestia.

Al leer "a lo bestia" vas a insertar esta información a lo bruto en el nuevo contenedor y el resultado es el siguiente:

* Vas a crear lagunas de memoria. El contenedor en el que vayas a almacenar el contenido del fichero va a perder el puntero a la memoria que previamente ha reservado para sus propios fines, por lo que no podrá liberar esa memoria.

* Si la lectura la realizas una vez hayas destruido la lista original vas a acceder a memoria que no te corresponde.

* Si la lectura se realiza según tu primer ejemplo vas a conseguir que los dos contenedores apunten a la misma lista. El problema que genera esto es que si uno de los dos altera la lista el otro contenedor va a empezar a acceder a memoria no válida. En el caso concreto de tu programa los dos contenedores van a hacer delete sobre la misma región de memoria y el segundo va a dar error, lo cual es lógico.

Espero que esta explicación te aclare los motivos por los que no funcionaba tu primer ejemplo.

Un saludo.