Vous êtes sur la page 1sur 4

Funciones Que Manejan La Asignacin Dinmica De Memoria.

En algunas situaciones de programacin es imposible saber que tan grande puede necesitarse un arreglo, y no
es posible usar un arreglo predefinido ya que en ese caso las dimensiones quedan establecidas en tiempo de
compilacin y no se pueden cambiar durante la ejecucin.
La solucin es crear arreglos dinmicos, sta utiliza memoria de la region de memoria libre denominada (el
monton) eap, y es accedido inde!ando un puntero a esa memoria.

En "urbo #, e!isten dos funciones que se denominan malloc() y free(). Estas dos funciones se encuentran en el
arci$o de cabecera %"&L'(.) .
*alloc()+ ,uncin que asigna memoria. Esta funcin de$uel$e un puntero $lido que contiene la direccin de la
nue$a porcin de memoria asignada. &e lo contrario de$uel$e un puntero nulo.
La funcin free() de$uel$e memoria al sistema. Es necesario cuando se termina de usar la porcin de memoria.
En forma general sus definiciones son+
$oid - malloc(sizeof num.bytes)/
$oid free ($oid - $ar.punt)/

Ejemplo de asignar memoria para un espacio de 01 enteros+
int -pi/
pi 2 malloc (01 - sizeof (int) )/
3signar memoria para 4111 bytes +
car -pc/
pc 2 malloc (4111 )/
3signar y liberar memoria para una serie de cadenas +
car -str54116/
for( i21 / i7411/ i88 ) 9
if (str5i6 2 (car -) malloc (4:; ) ) 22 <=LL ) 9
cout 77 > error al asignar memoria > 77 endl/ getc()/ e!it (4)/ ?
ges(str5i6)/ ?
for( i21 / i7411/ i88 ) 9 free ( str5i6 )/
@or ejemplo malloc en una lista enlazada con estructuras, se utiliza de la siguiente manera+

struct nodo.lista -p/
p2(struct nodo.lista -)malloc(sizeof(struct nodo.lista)/

%e utiliza la palabra reser$ada llamada >sizeofA, que entrega el tamaBo en bytes, en este caso est de$ol$iendo el
tamaBo de bytes de la estructura.
Operadores de manejo de memoria "new" y "delete"
El operador neC sir$e para reser$ar memoria dinmica.
%inta!is+ Dar.puntero 2 neC tipo.$ariable/
Dar.puntero 2 neC tipo.$ariable(tamaBo)/ EE tamaBo inicializa el tamaBo de la $ariable
Dar.puntero 2 neC tipo.$ariable5tam.arreglo 6/ EE tam.arreglo indica el tamaBo del arreglo
EE no se puede inicializar un arreglo
La inicializacin, si aparece, se usar para asignar $alores iniciales a la memoria reser$ada con neC, sin embargo
los arreglos no pueden ser inicializados.
%i la reser$a de memoria no tu$o !ito, neC de$uel$e un puntero nulo, <=LL.
El operador delete se usa para liberar la memoria dinmica reser$ada con neC.
%inta!is+ delete 7$ar.punteroF/
delete 5 tam.arreglo 67$ar.punteroF/ delete 5 6 7$ar.punteroF/
La e!presin ser normalmente un puntero, el operador delete56 se usa para liberar memoria de arreglos
dinmicos.
#uando se usa el operador delete con un puntero nulo, no se realiza ninguna accin. Esto permite usar el
operador delete con punteros sin necesidad de preguntar si es nulo antes.
<ota+ los operadores neC y delete son propios de #88.
Deamos algunos ejemplos+
int main() 9
car -c/
int -i 2 <=LL/
float --f/
int n/
c 2 neC car54:G6/ EE #adena de 4:: caracteres
f 2 neC (float -)5416/ EE 3rray de 41 punteros a float
for(n 2 1/ n 7 41/ n88) f5n6 2 neC float5416/ EE #ada elemento del arreglo es un array de 41 float
EE f es un array de 41-41
f516516 2 41.G:/ f5H65H6 2 :4.GH/
c516 2 IaI/ c546 2 1/
EE liberar memoria dinmica
for(n 2 1/ n 7 41/ n88) delete56 f5n6/
delete56 f/ delete56 c/ delete i/
return 1/
?
=n ejemplo seria el apartar memoria con neC para un puntero a cadena +
%tring++%tring (car -te!t)
9 lengt 2 strlen(te!t)/ EE calcula la longitude del te!to
car.ptr 2 neC car5lengt 8 46/ EE reser$a memoria
strcpy(car.ptr, te!t)/ ?/
La gran similitud de comportamiento de los punteros y los arrays nos permiten crear arrays durante la ejecucin, y
en este caso adems el tamaBo puede ser $ariable.
@ara ello se usan los punteros a punteros, y los arrays construidos de este modo se denominan arrays dinmicos.
Deamos la declaracin de un puntero a puntero+ int --tabla/
JtablaJ es un puntero que apunta a una $ariable de tipo puntero a int.
%abemos que un puntero se comporta casi igual que un array, por lo tanto nada nos impide que JtablaJ apunte al
primer elemento de un array de punteros+
int n 2 4GK/
tabla 2 neC (int -)5n6/
3ora estamos en un caso similar, JtablaJ apunta a un array de punteros a int, cada elemento de este array puede
ser a su $ez un puntero al primer elemento de otro array+
int m 2 :G4/
for(int i 2 1/ i 7 n/ i88)
tabla5i6 2 neC int5m6/
3ora tabla apunta a un array de dos dimensiones de n - m, podemos acceder a cada elemento igual que
accedemos a los elementos de los arrays normales+
tabla5:465GG6 2 4:G/
3ntes de abandonar el programa ay que liberar la memoria dinmica usada, primero la asociada a cada uno de
los punteros de Jtabla5i6J+ for(int i 2 1/ i 7 n/ i88) delete56 tabla5i6/
L despus la del array de punteros a int, JtablaJ+ delete56 tabla/
Deamos el cdigo de un ejemplo completo+
Minclude 7iostream.F
int main() 9
int --tabla/
int n 2 4GK/
int m 2 :G4/
EE 3rray de punteros a int+
tabla 2 neC (int -)5n6/
EE n arrays de m ints
for(int i 2 1/ i 7 n/ i88)
tabla5i6 2 neC int5m6/
tabla5:465GG6 2 4:G/
cout 77 tabla5:465GG6 77 endl/
EE Liberar memoria+
for(int i 2 1/ i 7 n/ i88) delete56 tabla5i6/
delete56 tabla/
return 1/
?
// usando aritmtica de puntero a punteros
int **a;
.
.
f = filas;
c = columnas;
a=new int *[f]; // apartando memoria
para el arreglo de punteros
for(int i=0;i<f;i++)
for(int =0;<c;++)
*(a+i)=new int[c];
// apartando memoria para las filas
for(i=0;i<f;i++)
for(=0;<c;++)
*(*(a+i)+)=0;
// iniciali!ando en ceros al arreglo de p a p.
Operadores new y delete con clases
Los operadores new y delete pueden ser aplicados tanto a $ariables de los tipos predefinidos (int, float, double,
N) como a objetos de las clases definidas por el usuario. %u principal aplicacin est en la creacin de $ariables
con reserva dinmica de memoria, sustituyendo a las funciones calloc(), malloc() y free() que se utilizan en #.
3quO es necesario acer alguna matizacin referente a su uso con las clases definidas por el usuario.
=na $ez creada la clase !uenta, una sentencia del tipo+
#.#uenta -c4 2 neC #.#uenta/
supone una operacin en tres fases+
4. En primer lugar se crea un puntero c" capaz de contener la direccin de un objeto de la clase.
:. 3 continuacin, por medio del operador new se reser$a memoria para un objeto del tipo !uenta.
G. ,inalmente se llama, de modo transparente al usuario, a un constructor de la clase !uenta.
Los constructores son funciones que se llaman automticamente al crear un objeto de una clase. %u misin
es dar un valor inicial a todas las $ariables miembro, de modo que no aya nunca objetos con $ariables sin un
$alor apropiado (conteniendo basura informtica). Los constructores se e!plican en el apartado siguiente. El
operador new se puede utilizar para crear vectores de objetos (en una forma similar a como se crean $ectores
de $ariables) con reser$a dinmica de memoria, en la forma+
#.#uenta -ctas 2 neC #.#uenta54116/
La diferencia fundamental entre new y delete por una parte# y malloc() y free() por otra es que los primeros
crean y destruyen objetos# mientras que los segundos se limitan a reser$ar y liberar zonas de memoria. 3dems
ay que tener en cuenta que new puede ser sobrecargado como cualquier otro operador, con las $entajas de
simplificacin de cdigo que ello supone.
3l utilizar delete (lo mismo sucede con free()), se libera la zona de memoria a la que apunta, pero sin borrar el
propio puntero. %i se manda liberar lo apuntado por un puntero nulo no pasa nada especial y el programa no
libera memoria. %in embargo si se ordena liberar dos veces lo apuntado por un puntero las consecuencias son
impre$isibles y puede que incluso catastrficas, por lo que es importante e$itar este tipo de errores.
En el caso de que se desee liberar la memoria ocupada por un $ector creado mediante reser$a dinmica de
memoria debe emplearse una instruccin del tipo+ delete 56 ctas/ siendo ctas el puntero al primer elemento del
$ector (el puntero que recogi el $alor de retorno de new).

Vous aimerez peut-être aussi