Title: Programaci
1Programación III
- Clase 10
- Apuntadores Memoria Dinámica
2Operadores para uso de Memoria Dinámica
Operador Significado
new type Reserva en memoria espacio para un objeto de tipo type y retorna su dirección
delete ptr Libera la memoria del objeto al que apunta ptr
new typeexpr Crea un arreglo de type de tamaño de expr
delete ptr Libera la memoria del arreglo al que apunta ptr
3Ejemplo de Memoria Dinámica
- int pInt new int
- pInt 17
- cout ltlt pIntltlt endl
- cout ltlt pIntltltendl
- delete pInt
HS
17
SS / DS
0x4CD0
17
0x4CD0
4Ahora, para crear arreglos dinámicos
HS
- int size 3
- float fp NULL
- fp new floatsize
- for(int i0iltsizei)
- fpi 2 i
- ...
- delete fp
0
4
1
SS / DS
0x4CD0
5Acerca del operador delete
- Se deben de tener ciertos cuidados con el uso del
operador delete - Debe de estar seguro que se le está aplicando a
una dirección de memoria previamente reservada en
el Heap. - Debe de estar seguro que no tenga el valor de
NULL la variable. - De no seguir estas indicaciones, el programa
terminará incorrectamente. - La segunda condición es fácil de validar, sin
embargo el evitar caer en la primera es
responsabilidad del programador.
6Ejemplo Validación
- if (ptr)
- delete ptr
- De esta manera se asegura que ptr no esté en NULL
antes de intentar ejecutar el delete.
7El Ámbito de la Memoria Dinámica
- A diferencia de las variables locales o globales,
las variables que residen en memoria dinámica no
mueren al finalizar su ámbito, sino que mueren
exclusivamente al llamar al operador delete sobre
la dirección de memoria donde se encuentran. - Es por esto que se dice que trascienden del
ámbito.
8Demostración
- double createArray(int s)
- double retVal NULL
- retVal new doubles
- return retVal
-
- ...
- double pd createArray(3)
SS / DS
0x4CD0
HS
0x4CD0
0x4CD0
9Y Los arreglos multidimensionales?
- En el caso de los arreglos multidimensionales
dinámicos, tendremos que comprender primero
ciertos aspectos de cómo se representan tanto
físicamente cómo lógicamente para el compilador. - Lo primero que hay que tener claro es que TODOS
los arreglos, así como TODOS los objetos de un
programa son guardados en la memoria en la forma
de un arreglo unidimensional.
10Representación de un Arreglo Bidimensional
(Física y Lógica)
Representación Física
Representación Lógica
a
a
5
4
4
6
2
4
6
6
Nótese que la representación lógica, es en sí un
arreglo de arreglos, donde a es de tipo int y
a0, a1 son de tipo int
11Y, Dinámicamente?
- Comprendiendo que un arreglo bidimensional es
representado en realidad por un arreglo de
punteros de la primera dimensión, que a su vez
apuntan, cada uno, a un arreglo de la segunda
dimensión podemos crear el procedimiento para la
creación dinámica de una matriz
12Código de Creación y Destrucción de Arreglos
Bidimensionales
- // Estos valores pueden ser introducidos
- // en tiempo de ejecución
- int rows 2, cols 3
- float matrix
- // Se crea el arreglo de punteros
- matrix new floatrows
- for (int i0 iltrows i)
- matrixi new floatcols
13Acerca del Tamaño de los Punteros
- El tamaño de los punteros depende directamente de
la cantidad de memoria que se desé direccionar. - Por ejemplo si sólo necesitamos direccionar 256
bytes, entonces nuestros punteros serían de 1
byte. Si quisieramos direccionar 64KB (65536
Bytes) entonces nuestros punteros serían de 2
bytes. - El tamaño de los punteros es independiente del
tamaño del objeto al que apuntan. (Probar
comparar los tamaños de punteros a char, y
punteros a long double)
14Retomando Ámbito y Tiempo de Vida
- Los Objetos Nacen
- En el momento de su declaración
- En el momento que se crean dinámicamente
- Los Objetos Mueren
- En el momento que se acaba su ámbito
- En el momento que se liberan (delete)