1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Curso de java básico (scjp)
Creación y destrucción de objetos
Informática II Prof. Dr. Gustavo Patiño MJ
Informática II 1 Diego Fernando Serna RestrepoSemestre 2011/2.
Implementación de Listas
Objetos y Clases en Java
Programación Orientada a Objetos en Java
Unidad 3 Punteros.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Material de apoyo Unidad 2 Estructura de datos
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
Programación III Clase 07 Funciones.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SEMANA TRES ASIGNACION.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos.
Vectors (Vectores) Agustin J. González ELO329. Contenidos Qué es un vector? Declaración de Objetos Vectores Inserción y eliminación de items Uso de sub-índices.
Clase 10: Estructuras de datos y arreglos.
ELO3201 Vectores (Vector) Agustín J. González ELO320.
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++
1 Objetos y Clases en Java ELO-329: Diseño y Programación Orientados a Objetos.
1 Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
Clases en C++ Agustín J. González ELO329.
1 Polimorfismo y Funciones Virtuales Agustín J. González ELO329.
1 Introducción a Clases Agustín J. González ELO329.
Introducción a los punteros Prof. Domingo Hernández.
Manejo de Punteros y objetos en memoria dinámica en C++
Dinamismo y Contenedores Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires (C++ Avanzado) Depto. de Computación Algoritmos y Estructuras.
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
Clase 10 Apuntadores & Memoria Dinámica
1 Manejo de Excepciones y otros Agustín J. González ELO-329.
1 Herencia Agustín J. González ELO Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases que tienen algo en común.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González ELO329.
1 Introducción a Clases Agustín J. González Versión original de Kip Irvine ELO329.
ELO3291 Manejo de Excepciones Lectura sugerida de texto en linea: Eckel, Bruce. Thinking About C++, 2nd Edition, Prentice-Hall, Gratis en
1 Definición y Conversión de datos Agustín J. González ELO-329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO326: Seminario II 2do. Sem
Clases y Objetos en Java ELO329: Diseño y Programación Orientados a Objetos.
1 Polimorfismo y Funciones Virtuales Agustín J. González Versión original de Kip Irvine ELO329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO329.
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
Programación Orientada a Objetos
1 Funciones Agustín J. González Versión Original de Kip Irvine ELO329.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
ELO3291 Manejo de Excepciones Agustín J. González ELO329.
1 Funciones en C++: Nota: Este material es de estudio personal, en clases sólo revisaremos las láminas con. Usted revise todo. Agustín J. González ELO329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend)‏ Agustín J. González ELO329.
MEMORIA DINÁMICA.
1 Definición y Conversión de datos Agustín J. González ELO-329.
Algunas Características de C++ no presentes en C Agustín J. González ELO-329.
Herencia en C++ Agustín J. González ELO329. Diseño y Programación Orientados a Objetos 2 Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases.
Manejo de Excepciones Agustín J. González ELO329 ELO329.
Manejo de Punteros y objetos en memoria dinámica en C++
Asignación Dinámica de Memoria
Manejo de Punteros y objetos en memoria dinámica en C++
Manejo de Punteros y objetos en memoria dinámica en C++
Manejo de Punteros y objetos en memoria dinámica en C++
Manejo de Punteros y objetos en memoria dinámica en C++
Manejo de Excepciones Agustín J. González ELO329 ELO329.
Manejo de Punteros y objetos en memoria dinámica en C++
Manejo de Punteros y objetos en memoria dinámica en C++
Manejo de Punteros y objetos en memoria dinámica en C++
Asignación Dinámica de Memoria
Transcripción de la presentación:

1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329

2 Asignación Dinámica Asignación Dinámica es la creación de un objeto mientras el programa está en ejecución. Para ello se usa el operador new. Los objetos creados con heap son almacenados en una gran espacio de memoria libre llamado heap. Cuando son creados de esta manera, los objetos permanecen en el heap hasta que son removidos de él. EL operador delete borra los objetos del heap.

3 Creando un Objeto int * P = new int; Usando el operador new, aquí creamos un objeto entero en el heap y asignamos su dirección a P. *P = 25; // assign a value cout << *P << endl; Ahora podemos usar el puntero de la misma manera como en los ejemplos previos.

4 Operadores new y delete Student * pS = new Student;. // use the student for a while.... delete pS; // elimina el objeto y // retorna espacio de memoria! El operador new retorna la dirección a objeto recién creado. El operador delete borra el objeto y lo deja no disponible. Llama al constructor de Student

5 Usando new en Funciones void MySub() { Student * pS = new Student; // use the Student for a while... delete pS; // delete the Student } // pS disappears Si tu creas un objeto dentro de una función, lo más probables es que haya que eliminar el objeto al interior de la misma función. En el ejemplo, la variable pS se sale del alcance una vez terminado el bloque de la función.

6 Memory Leaks (fuga de memoria) void MySub() { Student * pS = new Student; // use the Student for a while... } // pS goes out of scope (the Student's still left on the heap) Un memory leak (O fuga de memoria) es una condición de error que es creada cuando un objeto es dejado en el heap con ningún puntero conteniendo su dirección. Esto puede pasar si el puntero al objeto sale fuera del alcance:

7 Direcciones retornada por Funciones Student * MakeStudent() { Student * pS = new Student; return pS; } Una función puede retornar la dirección de un objeto que fue creado en el heap. (mas)

8 Recibiendo un puntero Student * pS; pS = MakeStudent(); // now pS points to a Student (continuación)... El que llama la función puede recibir una dirección y almacenarla en una variable puntero. El puntero permanece activo mientras el objeto Student es accesible (no ha sido borrado).

9 Invalidación de Punteros double * pD = new double; *pD = 3.523;. delete pD; // pD es inválido.... *pD = 4.2; // error! Un puntero se invalida cuando el objeto referenciado es borrado y luego tratamos de usar el puntero. Esto puede generar un error de ejecución irrecuperable.

10 Abolición de Punteros inválidos delete pD; pD = NULL;. if( pD != NULL ) // check it first... *pD = 4.2; Se recomienda asignar NULL a los punteros tan pronto los objetos referenciados son borrados. Y, obviamente chequear por NULL antes de usar un puntero. ¿Qué es mejor: tener un error de ejecución o un programa que parece funcionar pero arroja resultados no correctos?

11 Paso de Punteros a Funciones void swap( int * A, int * B ) /* C */ { int temp = *A; *A = *B; *B = temp; } El paso de un puntero a una función es casi idéntico al paso por referencia. La función tiene acceso de escritura y lectura a los datos referenciados. Así es como swap() se implementa en C, antes que C++ introdujera parámetros por referencia: void swap( int & A, int & B ) // C++ { int temp = A; A = B; B = temp; }

12 Punteros con el calificador Const void MySub( const int * A ) { *A = 50; // error A++; // ok } El puntero en si puede ser modificado, pero esto no tiene efecto duradero o posterior ya que puntero es pasado por valor (se crea uno local y le le copia el valor el parámetro actual). Un puntero calificado como const garantiza que le programa sólo tiene acceso de lectura de los datos referenciados por el puntero.

13 Punteros Constantes void MySub( int * const A ) { *A = 50; // ok A++; // error } La declaración de un puntero constante sólo garantiza que el puntero en si no puede ser modificado. Los datos referenciados por el puntero si pueden ser ser modificados.

14 Arreglos y Punteros int scores[50]; int * p = scores; *p = 99; cout << scores[0]; // "99" p++; // ok scores++; // error: scores is const EL nombre de un arreglo es compatible en asignaciones con un puntero al primer elemento de un arreglo. Por ejemplo, *p contiene scores[0].

15 Recorriendo un Arreglo int scores[50]; int * p = scores; for( int i = 0; i < 50; i++) { cout << *p << endl; p++; // increment the pointer } Actualmente el código con recorrido con índice es también eficiente. Programadores C y C++ frecuentemente usan punteros para recorrer arreglos. Hoy día el acceso vía índices corre tan eficientemente como el recorrido con punteros debido a la optimización hechas hoy por compiladores.

16 Arreglos de Punteros Student * cop3337[10]; for(int i = 0; i < 10; i++) { cop3337[i] = new Student; } Un arreglo de punteros usualmente contiene la dirección de objetos dinámicos. Esto ocupa poco almacenamiento para el arreglo y mantiene la mayor parte de los datos en el heap. diagrama

17 Arreglo de Punteros Student Heap cop3337 [ ] Stack

18 Creación de un Arreglo en el heap void main() { double * samples = new double[10]; // samples is now an array.... samples[0] = 36.2; delete [] samples; //eliminación de un arreglo } Podemos crear arreglos completos en el heap usando el operador new. Hay que recordar eliminarlo cuando corresponda. Para ello basta incluir "[]" antes del nombre del arreglo en la sentencia delete. array size

19 Punteros y Clases class Student { public: Student(); ~Student(); private: string * courses; // array of course names int count; // number of courses }; // mas... Los punteros son efectivos cuando los encapsulamos en clases porque podemos controlar su tiempo de vida.

20 Punteros en Clases Student::Student() { courses = new string[50]; count = 0; } Student::~Student() { delete [] courses; } El constructor crea el arreglo, y el destructor lo borra. De esta forma pocas cosas pueden salir mal...

21 Punteros en Clases Student X; Student Y(X); // construct a copy X.AddCourse(”elo 326"); cout << Y.GetCourse(0); // ”elo 326"...excepto cuando hacemos una copia de un objeto Student. EL constructor de copia de C++ conduce a problemas. Por ejemplo aquí un curso asignado al estudiante X termina en la lista de cursos del estudiante Y:

22 Punteros en Clases Student::Student(const Student & S2) { count = S2.count; courses = new string[count]; for(int i = 0; i < count; i++) courses[i] = S2.courses[i]; } Para prevenir este tipo de problemas, creamos un constructor de copia que efectúa lo conocido como una copia en profundidad.

23 Punteros en Clases Student & Student::operator =(const Student & S2) { delete [] courses; // delete existing array count = S2.count; for(int i = 0; i < count; i++) courses[i] = S2.courses[i]; return *this; } Por la misma razón, tenemos que sobrecargar (overload) el operador de asignación.

24 C++ Containers (contenedores) en Clases class Student { public: Student(); private: vector courses; }; Cuando usamos contenedores C++ estándares tales como listas y vectores en una clase, no hay problema con el constructor de copia en C++ porque todos ellos implementan adecuadamente estas operaciones.

25 Fin