Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 2014
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #7 [solución]

Deja huecos en la memoria dinámica

La clase 'dejaHuecos.h' que se usa en esta tarea tiene el problema de que su destructor no retorna toda la memoria dinámica de la instancia lo que, en consecuencia, deja montones de huecos. Además de corregir esa clase, escriba un programa que demuestre que su versión corregida de la clase funciona correctamente (use el truco de asignar toda la memoria dinámica disponible).

// dejaHuecos.h (c) 2014 adolfo@di-mare.com

/** \file  dejaHuecos.h
    \brief Clase que sirve para mostrar cómo lograr que el destructor de std::list<>
           no pueda recuperar toda la memoria dinámica.

    \author Adolfo Di Mare <adolfo@di-mare.com>
    \date   2014
*/

/// Esta clase almacena una hilera 'char*' pero deja huecos en la memoria dinámica.
class dejaHuecos {
    int    m_num;  ///< Número para identificar a este valor
    char * m_str;  ///< Hilera cuya memoria nunca se destruye

public:
    /// Constructor por defecto.
    dejaHuecos() : m_num(-666), m_str(0) {
        set( random<char>() ); // hilera aleatoria loca
    }
    /// Constructor 'int'.
    dejaHuecos(int n) : m_num(n) { set( random<char>() ); }
    /// Constructor.
    dejaHuecos(int n, char* str) : m_num(n), m_str(str) { }
    /// Constructor de copia.
    dejaHuecos( const & dejaHuecos OTRO ) m_num(OTRO.m_num), m_str(OTRO.m_str) {
        ( static_cast< dejaHuecos* > ( &OTRO ) ) -> m_str = 0;
        // le roba la hilera al otro .. RE-gacho...
    }
    /// Copiador.
    dejaHuecos& operator=( const dejaHuecos & OTRO ) : m_num(OTRO.m_num), m_str(OTRO.m_str) {
        ( const_cast< dejaHuecos* > ( &OTRO ) ) -> m_str = 0;
        // le roba la hilera al otro .. RE-gacho...
    }

    /// Truco para usar 2 proyectos para correr el mismo programa fuente.
    #ifdef SIN_HUECOS
        ~dejaHuecos() { if (m_str != 0) { free(m_str); } } ///< Destructor arreglado.
    #else
        ~dejaHuecos() { } ///< Destructor chocho.
    #endif


    /// Le asigna al objeto la hilera 'str'.
    void set( char * str ) { m_str = str; }

    /// Obtiene ladel objeto.
    void get( char * str ) { m_str = str; }
};

/// Declaración genérica de la función 'random()'.
template <T> T* random();

/// Especialización de 'random()' para el tipo 'char'.
/// Es un truco para no tener que usar un archivo [.cpp]
template <char>
char* random<char>() {
    unsigned long ahora;
    {   // http://stackoverflow.com/questions/997946/
        time_t timev;
        time(&timev);
        ahora = 2 * static_cast<unsigned long>( timev ) % 3500;
    }

    char * ret = 0; // NULL marca 'falle'
    while ( ret == 0 ) {
        ahora /= 2; // por si falló el 'malloc()' anterior
        ret = malloc( ahora );
    }

    if ( ret==0 ) {
        return static_cast< char*>( "CHANFLE" ); // malo MALO!
        throw "CHANFLE"; // ???
    }
}

// EOF: dejaHuecos.h (c) 2014 adolfo@di-mare.com

      Entregue su tarea por correo electrónico, como lo hizo anteriormente.

[mailto:] Entrega de Tareas

Tiempo de entrega: 7 días
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2014
Derechos de autor reservados © 2014
[home] <> [/\]