You are on page 1of 14

Algoritmos y Estructuras de Datos

Algoritmos y Estructuras de Datos

Clase: Memoria dinmica en C++


Dra. Adriana Menchaca Mndez

ENES Unidad Morelia, UNAM

Agosto 2016
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

C++ soporta tres tipos de asignacin de memoria:


Esttica: Se utiliza para las variables globales y estticas.
Este tipo de variables persisten durante toda la ejecucin
del programa.
Automtica: Se utiliza para las variables locales y
parmetros de funciones. Este tipo de variables se
mantienen durante la ejecucin de bloques de cdigo.
Dinmica: Se utiliza para solicitar memoria durante la
ejecucin del programa. El programador decide el tiempo
que ser utilizada.
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Tanto la memoria esttica como la automtica tienen dos


caractersticas en comn:
1. El tamao de las variables / arreglos deben conocerse en
tiempo de compilacin.
2. La asignacin y liberacin de memoria se hacen
automticamente.
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Debido a que muchas veces el tamao de la memoria


requerida depende de la entrada que se de al programa
(usuario / archivo), surge la necesidad del uso de la memoria
dinmica.
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Cada vez que se solicita memoria en tiempo de ejecucin, se le


pregunta al sistema operativo si tiene espacio en la memoria.
Si existe memoria disponible, el sistema operativo regresa
la direccin de dicha memoria.
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Variables simples

Para solicitar memoria en tiempo de ejecucin de una variable


simple se usa:

1 // dynamically allocate an integer and assign the


address to ptr so we can access it later
2 int *ptr = new int;
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Variables simples

En caso de que no se haya podido reservar memoria, una


excepcin llamada bad_alloc es lanzada.
Si dicha excepcin no es manejada, el programa
terminar.
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Variables simples

1 // ask for an integers worth of memory


2 int *value = new (std::nothrow) int;
3 if (!value) // handle case where new returned null
4 {
5 std::cout << "Could not allocate memory";
6 exit(1);
7 }
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Variables simples

Para liberar memoria en tiempo de ejecucin de una variable


simple se usa:

1 // assume ptr has previously been allocated with


operator new
2 // return the memory pointed to by ptr to the
operating system
3 delete ptr;
4 // set ptr to be a null pointer (use nullptr
instead of 0 in C++11)
5 ptr = 0;
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Variables simples

Como buenas prcticas de programacin se recomienda hacer:

1 // If ptr isnt already allocated, allocate it


2 if (!ptr)
3 ptr = new int;
4

5 if (ptr)
6 delete ptr;
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Arreglos

Para solicitar memoria de un arreglo utilizamos:

1 int *array = new int[length];


Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Arreglos

Para liberar memoria de un arreglo utilizamos:

1 delete[] array;
Algoritmos y Estructuras de Datos

Memoria dinmica en C++


Arreglos

1 # include <iostream >


2
3 i n t main ( ) {
4 s t d : : c o u t << "Enter a positive integer: " ;
5 in t length ;
6 s t d : : c i n >> l e n g t h ;
7 / / use a r r a y new . Note t h a t l e n g t h does n o t need t o be
constant !
8 i n t a r r a y = new i n t [ l e n g t h ] ;
9 s t d : : c o u t << "I just allocated an array of integers of
length " << l e n g t h << \n ;
10 a r r a y [ 0 ] = 5 ; / / s e t element 0 t o v a l u e 5
11 d e l e t e [ ] a r r a y ; / / use a r r a y d e l e t e t o d e a l l o c a t e a r r a y
12 a r r a y = 0 ; / / use n u l l p t r i n s t e a d o f 0 i n C++11
13 return 0;
14 }
Algoritmos y Estructuras de Datos

Memoria dinmica en C++

Variables simples

Una vez que se ha solicitado memoria en tiempo de ejecucin


para un arreglo, no es posible cambiar el tamao del mismo.
Una posible solucin es crear otro arreglo y hacer la copia. Sin
embargo, no se recomienda hacer esto. Para ello existe una
librera estndar llamada std::vector que permite el uso de
arreglos redimensionados.

You might also like