Manejo de Punteros y objetos en memoria dinámica en C++

Slides:



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

Clases en C++.
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
Herramientas para el acceso directo a memoria en C++
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.
Manejo de Excepciones Agustín J. González ELO329.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SEMANA TRES ASIGNACION.
PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++
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.
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.
1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329.
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.
Dinamismo y Contenedores Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires (C++ Avanzado) Depto. de Computación Algoritmos y Estructuras.
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.
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
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.
El lenguaje C++ Isidro González Caballero (Universidad de Oviedo) Técnicas de Comp. en Física Santander, 13/12/
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.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
Lenguaje de Programación II Prof. Rafael Montenegro B. Carrera: T.S.U en Informática Periodo: 2014-I.
Manejo de Punteros y objetos en memoria dinámica en C++
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
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++
Plantillas (Templates)‏
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 Punteros y objetos en memoria dinámica en C++
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Asignación Dinámica de Memoria
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Transcripción de la presentación:

Manejo de Punteros y objetos en memoria dinámica en C++ Agustín J. González ELO 329

Diseño y Programación Orientados a Objetos 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 new son almacenados en el heap, una gran espacio de memoria libre gestionado por el sistema operativo. Cuando objetos son creados de esta manera, éstos permanecen en el heap hasta que son removidos de él con el operador delete. Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos 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. Ahora podemos usar el puntero de la misma manera como en los ejemplos previos. *P = 25; // assign a value cout << *P << endl; Diseño y Programación Orientados a Objetos

Operadores new y delete Student * pS = new Student; El operador new retorna la dirección a objeto recién creado. El operador delete borra el objeto y lo deja no disponible. // usamos pS por un rato ... delete pS; // elimina el objeto y retorna espacio // de memoria! Versión C++ de free. Llama al constructor Student() Diseño y Programación Orientados a Objetos

Usando new en Funciones Si se crea un objeto dentro de una función, lo más probable 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. void MySub()‏ { Student * pS = new Student; // usamos Student por un rato... delete pS; // borra el estudiante pS } // pS desaparece Diseño y Programación Orientados a Objetos

Memory Leaks (fuga de memoria)‏ Un memory leak (o fuga de memoria) es una condición de error 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: void MySub()‏ { Student * pS = new Student; // usamos el estudiante pS por un rato } // pS sale del alcance (el objeto Student permanecerá en el heap !!!)‏ Diseño y Programación Orientados a Objetos

Direcciones retornada por Funciones Una función puede retornar la dirección de un objeto que fue creado en el heap. Student * MakeStudent()‏ { Student * pS = new Student; return pS; } (más)‏ Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Recibiendo un puntero (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. Student * pS; pS = MakeStudent(); // Ahora pS apunta a Student Diseño y Programación Orientados a Objetos

Invalidación de Punteros 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. double * pD = new double; *pD = 3.523; delete pD; // pD es inválido... *pD = 4.2; // error! Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Arreglos y Punteros El nombre de un arreglo es compatible en asignaciones con un puntero al primer elemento de un arreglo . Por ejemplo, *p contiene scores[0]. int scores[50]; // scores es equivalente a un puntero constante int * p = scores; *p = 99; cout << scores[0]; // "99" p++; // ok scores++; // error: scores is const Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Arreglos de Punteros 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. Student * elo329[10]; for(int i = 0; i < 10; i++)‏ { elo329[i] = new Student; } diagrama Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Arreglo de Punteros Heap Stack Student Student Student Student Student Student Student Student Student elo329 [ ] Student Diseño y Programación Orientados a Objetos

Creación de un Arreglo en el heap 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. void main()‏ { double * samples = new double[10]; // samples es un arreglo.... samples[0] = 36.2; delete [] samples; //eliminación de un arreglo desde el heap } // no se requiere poner en número de entradas. Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Punteros y Clases Los punteros son efectivos cuando los encapsulamos en clases porque podemos controlar su tiempo de vida. Debemos poner cuidado con la copia baja o copia en profundidad ya vista en Java. class Student { public: Student(); ~Student(); private: string * courses; // array of course names int count; // number of courses }; // más... Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Punteros en Clases El constructor crea el arreglo, y el destructor lo borra. De esta forma pocas cosas pueden salir mal … Student::Student()‏ { courses = new string[50]; count = 0; } Student::~Student()‏ delete [] courses; Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Punteros en Clases ...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: Student X; Student Y(X); // Constructor copia X.AddCourse(”elo 329"); // suponemos que tenemos este // método en Student cout << Y.GetCourse(0); // ”elo 329" , suponemos que este //método existe Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Copia en profundidad Para prevenir este tipo de problemas, creamos un constructor copia que efectúa una copia en profundidad. Student::Student(const Student & S2)‏ { count = S2.count; courses = new string[count]; for(int i = 0; i < count; i++)‏ courses[i] = S2.courses[i]; } Diseño y Programación Orientados a Objetos

Diseño y Programación Orientados a Objetos Punteros en Clases Por la misma razón, tenemos que sobrecargar (overload) el operador de asignación. Student & Student::operator =(const Student & S2)‏ { delete [] courses; // delete existing array count = S2.count; courses = new string[count]; for(int i = 0; i < count; i++)‏ courses[i] = S2.courses[i]; return *this; } Regla de ORO: Si una clase requiere un constructor de copia, también requerirá la sobrecarga del operador asignación y definición del destructor. Diseño y Programación Orientados a Objetos

Contenedores C++ en Clases Cuando usamos contenedores estándares de C++ 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. class Student { public: Student(); private: vector<string> courses; }; Diseño y Programación Orientados a Objetos