Download 1 Herramientas para el acceso directo a memoria en C++

Document related concepts
no text concepts found
Transcript
Herramientas para el
acceso directo a memoria
en C++
M.C. Juan Carlos Olivares Rojas
1
Agenda
Apuntadores en C++.
Relación entre arreglos y apuntadores en
C++.
Aritmética de apuntadores en C++.
Memoria estática y dinámica
Creación y uso de arreglos y objetos
dinámicos en C++. Comparación con JAVA.
2
Apuntadores en C++.
• Los apuntadores son variables que
almacenan direcciones en lugar de datos.
• Los apuntadores permiten apuntar hacia
distintas localidades de memoria, por lo
que se utilizan para generar memoria
dinámica.
3
Apuntadores en C++
• Los apuntadores pueden ser de cualquier
tipo, se declaran anteponiendo un *:
• int *puntero; //apuntador a un entero
• char *cad; //apuntador a caractér
• void *puntero; //puntero a cualquier tipo
de dato
4
Relación entre arreglos y
apuntadores en C++.
• La relación que existe entre un arreglo y
un apuntador es que el nombre de un
arreglo representa una dirección de
memoria y los subíndices representan un
desplazamiento.
• Las cadenas son arreglos de caracteres
(apuntador a un carácter)
5
Aritmética de apuntadores en C++.
• La aritmética de apuntadores significa
poder desplazarse a través de la memoria.
• Sólo se pueden utilizar los operadores +,-,
++, -- y otros operadores de manera
indirecta.
• El operador & se utiliza para obtener la
dirección de una variable.
6
Memoria estática y dinámica
• Los apuntadores se utilizan para crear
memoria dinámica.
• De manera predeterminada, las variables
se crean con memoria estática en lo que se
conoce como tiempo de ejecución, por eso
se debe de definir un tamaño máximo en
los arreglos.
7
Memoria Dinámica
• La memoria dinámica se puede crear
simplemente teniendo un tipo de dato
puntero.
• Por ejemplo para declarar un arreglo de
enteros dinámicos, quedaría así:
• int *arreglo; //no se especifica tamaño
8
Memoria Dinámica
• En C se utiliza la función malloc para pedir
memoria y free para liberarla.
• arreglo = (int *) malloc(N * sizeof(int));
• free(arreglo);
• En Java no existe como tal los punteros
pero se puede utilizar memoria dinámica.
9
Memoria Dinámica
• En C++ al igual que Java se utiliza el
operador new para pedir memoria
dinámica. De hecho en Java los arreglos
deben crearse con el operador new:
• int a[5] = new int[5]; //Java
• int a[] = new int[N]; //C++
10
Memoria Dinámica
• delete [] a;
• En Java no existe el concepto de liberar
memoria ya que se hace de manera
automática con el recolector de basura.
• La memoria dinámica sirve para crear otros
tipos de ADT más especializados como
11
listas, pilas, colas, árboles, etc.
Memoria Dinámica
• Al borrar un elemento se regresa la
memoria que se pidió, por eso es
importante liberar la memoria, ya que si
no se hace se pierde ese pedazo.
• Si se crea memoria dinámica para un
objeto se puede llamar a su constructor
para que lo inicialice.
12
Creación y uso de arreglos y objetos
dinámicos en C++. Comparación con
JAVA.
• En Java no existe el concepto de puntero.
Se pueden crear memoria dinámica.
• En objetos al liberar memoria se invoca de
manera automática al destructor en C++ y
al método finalize() y variantes en Java.
13
Actividad
• Realizar un programa que cree un arreglo
con la mayor cantidad de números primos.
• El usuario deberá introducir el tamaño del
arreglo y este deberá hacerse a través de
memoria dinámica. El límite lo marcará el
tamaño de la memoria disponible.
14
¿Preguntas, dudas y comentarios?
15