[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