<div dir="ltr">Hola a todos:<div><br></div><div style>Tengo la siguiente clase:</div><div style><br></div><div style><div><i>class Language //Clase para cargar todas las cadenas de idioma en memoria</i></div><div><i>{</i></div>
<div><i>private:</i></div><div><i>    LanguageFile* loaded;</i></div><div><i>    vector<string> text;</i></div><div><i>public:</i></div><div><i>    Language(const char* filename, bool tomem=true) {loaded=new LanguageFile(filename); if (tomem) loadtomem();}</i></div>
<div><i>    ~Language()</i></div><div><i>    {</i></div><div><i>        text.clear();</i></div><div><i>        delete loaded;</i></div><div><i>    }</i></div><div><i>    bool loadtomem();</i></div><div><i>    string read(unsigned int);</i></div>
<div><i>    void coutit(); //Debug only</i></div><div><i>};</i></div><div><br></div><div style>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:</div>
<div><br></div><div><div><i>bool Language::loadtomem()</i></div><div><i>{</i></div><div><i>    if (loaded==NULL) return false;</i></div><div><i>    text.reserve(RESERVED_SIZE);</i></div><div><i>    while(loaded->file.good())</i></div>
<div><i>    {</i></div><div><i>        string buf;</i></div><div><i>        getline(loaded->file,buf);</i></div><div><i>        text.push_back(buf);</i></div><div><i>    }</i></div><div><i>    if (loaded->file.eof() || loaded->file.good())</i></div>
<div><i>    {</i></div><div><i>        loaded->file.clear();</i></div><div><i>        loaded->file.close();</i></div><div><i>        delete loaded;</i></div><div><i>        return true;</i></div><div><i>    }</i></div>
<div><i>    else</i></div><div><i>    {</i></div><div><i>        text.clear();</i></div><div><i>        return false;</i></div><div><i>    }</i></div><div><i>}</i></div></div><div><br></div><div style>Y ésta es la declaración de la clase LanguageFile (no tiene nada pero es para que se vea sin más):</div>
<div style><br></div><div><div><i>class LanguageFile //Maneja el idioma desde archivo</i></div><div><i>{</i></div><div><i>private:</i></div><div><i>    ifstream file;</i></div><div><i>public:</i></div><div><i>    string buffer;</i></div>
<div><i>    LanguageFile(const char* filename) {file.open(filename);}</i></div><div><i>     ~LanguageFile() {if (file.is_open()) file.close();}</i></div><div><i>    friend class Language;</i></div><div><i>    void coutit() {getline(file,buffer); cout<<buffer<<endl;} //debug only</i></div>
<div><i>};</i></div></div><div><br></div><div style>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.</div>
<div style><br></div><div style>¿Qué puedo hacer para arreglar o mejorar esto?</div><div style><br></div><div style>Gracias por todo y un saludo.</div></div></div>