[C con Clase] Ayuda con asignación dinámica de memoria

Steven Davidson srd4121 en njit.edu
Vie Abr 15 08:29:35 CEST 2011


Hola fxy_95,

On 4/14/2011 11:24 PM, fxy_95 wrote:
> Hola, quisiera saber si alguien me podría explicar algo sobre este
> tema, ya que quisiera adentrarme más en esto de la programación con
> C++ y la asignación dinámica de memoria se me hace un tema bastante
> interesante.
>
> He leído el curso sobre las palabras new y delete, pero que más me
> podrían explicar o dejar más en claro, además quisiera entender como
> intervienen los destructores en este tema.
>

No es un tema demasiado complicado, pero obviamente si no has usado 
antes memoria dinámicamente adjudicada, puede resultar desconcertante.

La idea es que podemos controlar cuándo adjudicamos (creamos) memoria y 
cuándo la desadjudicamos (destruimos o liberamos). Podremos diseñar 
programas más eficientes con la memoria, creándola cuando la 
necesitemos, según la lógica que diseñemos.

La otra ventaja es que la memoria adjudicada proviene de la memoria 
común a todos los procesos. En general, la memoria que usan las 
variables que definimos pertenece a la memoria del programa. Al crear 
memoria dinámicamente, ésta residirá en la memoria común del sistema. 
Esto implica que típicamente tendremos acceso a una cantidad mayor de 
memoria que la que las variables definidas usan en nuestros programas. 
Por ejemplo,

int main()
{
   unsigned char array[INT_MAX];  // Ocuparía 4 GB

   return 0;
}

El compilador posiblemente no te permita crear tal array porque requiere 
mucha memoria que un programa no podría cargar ni ejecutar. Si lo 
permite, entonces seguramente el sistema operativo te daría un error al 
intentar ejecutar este programa.

Ahora bien, con memoria adjudicada dinámicamente, tendríamos acceso a 
más memoria o incluso a toda ella. Por ejemplo,

int main()
{
   unsigned char *ptr = new unsigned char[INT_MAX];  // Pedimos 4 GB

   delete[] ptr;
   return 0;
}

Recuerda que siempre debemos liberar la memoria que creamos.

No sé si has visto el resto del curso de C++, pero podrías continuar 
este tema con el capítulo 17: 
http://c.conclase.net/curso/index.php?cap=017#inicio

En cuanto a los destructores, recuerda que al destruir un objeto, se 
invoca inmediatamente su destructor. Esto es importante cuando un objeto 
contiene punteros que apuntan a memoria adjudicada dinámicamente. Como 
debemos seguir la regla de liberar la memoria que creamos previamente, 
la única posibilidad que nos queda para cumplir esta regla es en el 
destructor. Por ejemplo,

class Algo
{
private:
   double *ptr;
   int nCant;

public:
   Algo( int n ) : ptr(0), nCant(n)
   {
     ptr = new double[nCant];
   }

   ~Algo()
   {
     delete[] ptr;
   }
};

El constructor pide memoria dinámicamente y el destructor la libera.


Espero que esto te aclare un poco el tema.

Steven





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