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