Cita:
Iniciado por dehm 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_Nodeptr _Myhead; // pointer to head node
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.