[C con Clase] Duda insignificante pero que me trae de cabeza...

Borja Ilundain borjailundain en gmail.com
Vie Mayo 17 09:37:42 CEST 2013


Hola a todos:

Tengo la siguiente clase:

*class Language //Clase para cargar todas las cadenas de idioma en memoria*
*{*
*private:*
*    LanguageFile* loaded;*
*    vector<string> text;*
*public:*
*    Language(const char* filename, bool tomem=true) {loaded=new
LanguageFile(filename); if (tomem) loadtomem();}*
*    ~Language()*
*    {*
*        text.clear();*
*        delete loaded;*
*    }*
*    bool loadtomem();*
*    string read(unsigned int);*
*    void coutit(); //Debug only*
*};*

La cuestión es que la tengo configurada para que, una vez que halla cargado
toda la información del archivo mediante el método loadtomem, borre la
variable dinámica asignada al archivo y así liberamos algo de memoria. No
obstante, mantengo el puntero loaded como un atributo de la clase por si
acaso quiero extender la clase y añadir métodos que me permitan leer las
cadenas individualmente desde el archivo, sin tener que cargarlas todas en
memoria (caso en el que no habría que invocar a loadtomem). Os dejo la
definición del método:

*bool Language::loadtomem()*
*{*
*    if (loaded==NULL) return false;*
*    text.reserve(RESERVED_SIZE);*
*    while(loaded->file.good())*
*    {*
*        string buf;*
*        getline(loaded->file,buf);*
*        text.push_back(buf);*
*    }*
*    if (loaded->file.eof() || loaded->file.good())*
*    {*
*        loaded->file.clear();*
*        loaded->file.close();*
*        delete loaded;*
*        return true;*
*    }*
*    else*
*    {*
*        text.clear();*
*        return false;*
*    }*
*}*

Y ésta es la declaración de la clase LanguageFile (no tiene nada pero es
para que se vea sin más):

*class LanguageFile //Maneja el idioma desde archivo*
*{*
*private:*
*    ifstream file;*
*public:*
*    string buffer;*
*    LanguageFile(const char* filename) {file.open(filename);}*
*     ~LanguageFile() {if (file.is_open()) file.close();}*
*    friend class Language;*
*    void coutit() {getline(file,buffer); cout<<buffer<<endl;} //debug only*
*};*

Mi problema es que, tal y como está todo, el programa no me hace una salida
limpia, ya que llama al destructor de LanguageFile dos veces, la primera al
borrarlo al llamar a loadtomem, y la segunda al llamar al destructor de
Language, lo que provoca un error de segmentación. De hecho, si borro la
segunda línea del destructor de ésta (delete loaded), el programa sale sin
problemas, pero si el programa se terminase de forma inesperada, no
aseguraría que la memoria reservada a esta variable dinámica se liberase
correctamente.

¿Qué puedo hacer para arreglar o mejorar esto?

Gracias por todo y un saludo.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130517/3aaa1f58/attachment.html>


Más información sobre la lista de distribución Cconclase