Tema 6. Gestión dinámica de memoria

Documentos relacionados
Tema 5. Estructura de datos Pila

Tema 8. Listas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz

Tema 7. Colas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía. {badia, bmartine,

GESTIÓN DE MEMORIA DINÁMICA

Implementación de las Clases Pila, Cola, Lista y Arbol

Implementación de las Clases Pila, Cola, Lista y Arbol

Tema 6: Memoria dinámica

TEMA 8: Gestión dinámica de memoria

Objetos y memoria dinámica

Tipos Recursivos de Datos

Tipos de Datos Recursivos

Hoja de ejercicios del Tema 9

PUBLICACIÓN DEL ENUNCIADO: Semana del 10 de noviembre de ENTREGA: Clase de laboratorio de la semana del 8 de diciembre de 2003.

Tema 2: Clases y Objetos

Tema 2. Tipos y Estructuras Básicas

Memoria en C++ Punteros - Referencias Clases Y ahora, a trabajar! Memoria Dinámica en C++

Clases y Objetos en C++

Capitulo V Listas Enlazadas

3 - Tipos Inductivos (Recursivos)

Punteros y Memoria Dinámica II

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

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Memoria Dinámica en C++

Tema 3. Análisis de costes

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

Estructuras Enlazadas AyED UTN-BA

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 3

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Impresión por pantalla. 3. Indicar la salida por pantalla (2 puntos-20 minutos)

Asignación Dinámica de Memoria. Agustín J. González Versión original de Kip Irvine ELO 326: Seminario II 2do. Sem. 2001

PILAS. Prof. Ing. M.Sc. Fulbia Torres

Tema 9. Recursividad

Definición y Conversión de datos. Agustín J. González ELO-329

Asignación de Memoria (Allocation) Algoritmos y Estructuras de Datos I. Asignación de Dinámica de Memoria

El lenguaje C++ A partir del lenguaje C Entorno de programación Visual C++

ÁRBOL BINARIO. T der. Árbol binario homogéneo es aquel cuyos nodos tienen grado 0 ó 2(no hay ninguno de grado 1).

directamente indirectamente

PROGRAMACIÓN ORIENTADA A OBJETOS

Punteros y aritmética de punteros. se almacena el operando

Manejo de memoria en C

Programación orientada a objetos I

Introducción a C++. Asignatura Estructuras de Datos Curso 2017/2018 ETSISI UPM

Tema 18: Memoria dinámica y su uso en C

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

CLASE 10 - ESTRUCTURAS DE DATOS DINÁMICAS

Universidad Autónoma del Estado de México 2016, Año del 60 Aniversario de la Universidad Autónoma del Estado de México

El operador contenido ( ) permite acceder al contenido de

Solución práctico 6 Tipos Abstractos de Datos Lista, Pila y Cola

Tema: Tipos Abstractos de Datos (TAD s) en C++.

Temario. Tema 5. Estructuras de Datos no Lineales. 5.1 Árboles Binarios 5.2 Árboles n-arios

PUNTEROS O APUNTADORES C++

LISTAS. Prof. Ing. M.Sc. Fulbia Torres

PILAS Fundamentos

Tema 10. Árboles. José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía

ÁRBOLES PARCIALMENTE ORDENADOS

ELO329: Diseño y Programación Orientados a Objetos Segundo Certamen

Estructuras de Datos

Tema 13: Apuntadores en C

Tema 2: Clase y objetos en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

APUNTES PROII 2º PARCIAL.

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Herencia y polimorfismo

Creación de clases en C++ (I)

UNIVERSIDAD AUTONOMA DE MADRID ESCUELA POLITÉCNICA SUPERIOR ESTRUCTURAS DE DATOS Y ALGORITMOS

Apuntadores en C y C++

Estructuras Dinámicas

Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Escuela Politécnica Superior de Elche

Clases, Objetos y Métodos (II)

CONTENEDORES DE LA BIBLIOTECA

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo

Tema 2. Programación basada en objetos. Programación Avanzada Ingeniería Técnica en Informática de Gestión Jorge Badenas

12. COLAS Introducción Fundamentos

Tema: Plantillas en C++.

Unidad III: Estructuras lineales

INFORMATICA II PRIMER PARCIAL

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

Una lista de operadores que pueden o no sobrecargarse es la siguiente: Operadores que pueden sobrecargarse

Tema 1. Programación modular. Programación Avanzada Ingeniería Técnica en Informática de Gestión Jorge Badenas

TEMA 0 Gestión de Memoria Dinámica

TAD Lineales: Pila, Cola y Lista

Introducción al lenguaje C

Manual de referencia de C++ Parte IV Variables Punteros. Preparado por Prof. Luis A. Ortiz Ortiz

ELO329: Diseño y Programación Orientados a Objetos 20 de Junio de Certamen Final

Contenido. Prefacio Orígenes de la programación orientada a objetos... 1

Estructura de datos y de la información Boletín de problemas - Tema 10

Segundo Parcial de Programación 2 7 de junio de 2017

Algoritmo, Estructuras y Programación II Ing. Marglorie Colina

Programación Orientada a Objetos en C++

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

Principios de Computadoras II

Prof. Dr. Paul Bustamante

Algoritmos y Estructurasde Datos II Apuntadores y memoria dinámica

Un elemento de cualquier clase llamada Info; Un puntero a un nuevo nodo llamado sig; De tal forma una unión de nodos hace que tengamos una lista:

Transcripción:

Tema 6. Gestión dinámica de memoria http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, sanchiz@icc.uji.es Estructuras de datos y de la información Universitat Jaume I

Índice 1. Punteros en C++ 5 2. Memoria dinámica en C++ 10 3. Pila con un vector dinámico 13 4. Pila enlazada 26

Tema 6. Gestión dinámica de memoria 3 / 32 Bibliografía (Nyhoff 99), apartados 2.4, 3.4 y capítulo 7 (Main y Savitch 01), capítulos 4 y 5 y apartado 7.3

Tema 6. Gestión dinámica de memoria 4 / 32 Objetivos Recordar el concepto y uso de los punteros y sus operaciones asociadas. Recordar el concepto y uso de memoria dinámica. Saber implementar en C++ una versión dinámica de un tipo de datos. Saber implementar en C++ una versión enlazada de un tipo de datos.

Tema 6. Gestión dinámica de memoria 5 / 32 1 Punteros en C++ Puntero: Variable que contiene una dirección de memoria. Apunta a una posición en memoria Declaración de punteros: tipo * puntero [ = dirección ]; Sólo podrá apuntar a variables del tipo. No se reserva espacio para la variable del tipo. Ejemplo: i n t i ; double dptr, eptr ; / / delante de cada v a r i a b l e puntero i n t cptr = & i / / & devuelve l a d i r e c c i ó n de una v a r i a b l e

Tema 6. Gestión dinámica de memoria 6 / 32 1 Punteros en C++ (II) Asignación: dptr = eptr ; eptr = & x ; dptr = 0 / / Puntero nulo ( NULL) Indirección: ( Acceso a la variable apuntada) y = dptr ; x = y + eptr ; eptr = x ; Comparación: (sólo entre punteros al mismo tipo base) dptr = = eptr eptr! = & x

Tema 6. Gestión dinámica de memoria 7 / 32 1 Punteros en C++ (III) Punteros a clases class complejo { public : complejo & I n i c i a ( double r, double i ) ; void Muestra ( ) const ; private : double real, imag ; ;... complejo c ; complejo p t r c = & c ; ( p t r c ). I n i c i a ( 3. 0, 1. 5 ) ; ptrc > I n i c i a ( 1. 2, 5. 4 ) ;

Tema 6. Gestión dinámica de memoria 8 / 32 1 Punteros en C++ (IV) El puntero this En las clases, la palabra reservada this es un puntero al objeto Ejemplo complejo & I n i c i a ( double r, double i ) { r e a l = r ; imag = i ; return this ; / / Devuelve e l o b j e t o... complejo c ; c. I n i c i a ( 3. 0, 2. 3 ). Muestra ( ) ;

Tema 6. Gestión dinámica de memoria 9 / 32 1 Punteros en C++ (V) Aritmética con punteros i n t vector [ 4 ] = { 0, 1, 2, 3 ; i n t p t r = vector ; / / i n t p t r = & ( vector [ 0 ] ) cout < < p t r ; / / Muestra vector [ 0 ] p t r + + ; / / Añade s i z e o f ( i n t ), NO 1 cout < < p t r ; / / Muestra vector [ 1 ] p t r = vector ; for ( i n t i = 0 ; i < 4 ; i + + ) { / / Recorrido del vector cout < < p t r ; p t r ++;

Tema 6. Gestión dinámica de memoria 10 / 32 2 Memoria dinámica en C++ Problema Las variables estáticas tienen un tamaño fijo. Solución C++ permite reservar y liberar zonas de memoria en tiempo de ejecución. Reserva de memoria new tipo; Reserva espacio para una variable del tipo y devuelve su dirección. i n t p t r ; ptr p t r = new i n t ; 0x13eff860 *ptr

Tema 6. Gestión dinámica de memoria 11 / 32 2 Memoria dinámica en C++ (II) new tipo[num]; Reserva espacio para num posiciones de tipo y devuelve la dirección inicial. vptr vptr[0] i n t v p t r ; 0x13eff860 v p t r = new i n t [ 8 ] ; vptr[1] Ejemplo cout < < " Numero de elementos? " ; c i n > > tam ; i n t p t r = new i n t [ tam ] ;... for ( i n t i = 0 ; i <tam ; i ++) p t r [ i ] = i ;

Tema 6. Gestión dinámica de memoria 12 / 32 2 Memoria dinámica en C++ (III) Liberación de memoria delete puntero; delete [] puntero; La memoria liberada puede reutilizarse en reservas posteriores. Ejemplo double p t r = new double [ 4 ] ;... p t r [ 2 ] = 1. 5 ; cout < < p t r [ 2 ] ; / / Escribe 1. 5 delete [ ] p t r ; cout < < p t r [ 2 ] ; / / Valor i n d e f i n i d o. Posible e r r o r

Tema 6. Gestión dinámica de memoria 13 / 32 3 Pila con un vector dinámico const i n t MaxElem = 1 2 8 ; typedef i n t tipobase ; class Stack { public : / / stack, empty, push, pop y top private : tipobase elementos [ MaxElem ] ; i n t tope ; ; Cada vez que se crea un objeto de la clase, se reserva espacio para todos los datos de la misma: vector de elementos y tope. La reserva se mantiene hasta salir del ámbito donde está declarado.

Tema 6. Gestión dinámica de memoria 14 / 32 3 Pila con un vector dinámico (II) Ejemplo de gestión estática de la memoria i n t Fondo ( stack p ) ;... i n t main ( ) { stack p ; / / Creación de una p i l a cout < < " Fondo : " < < Fondo ( p ) ; / / Copia + destrucción i f (! p. empty ( ) ) { i n t i ; stack o t r a ; / / Creación de o t r a p i l a i =Fondo ( o t r a ) ; / / Copia + destrucción / / Destrucción de l a p i l a o t r a / / Destrucción de l a p i l a p

Tema 6. Gestión dinámica de memoria 15 / 32 3 Pila con un vector dinámico (III) Clase Pila con vector dinámico class stack { public : stack ( i n t numelem = 1 2 8 ) ; stack ( ) ; stack ( const stack & origen ) ; stack & operator = ( const stack & origen ) ; / / empty, push, pop y top private : tipobase elementos ; i n t capacidad, tope ; ;

Tema 6. Gestión dinámica de memoria 16 / 32 3 Pila con un vector dinámico (IV) En clases que utilicen memoria dinámica es necesario crear nuevas funciones miembro y modificar otras: Constructores: Reservan espacio para los nuevos objetos. Destructores: Liberan el espacio reservado para los objetos. Constructores de copia: Construyen objetos como copias de otros. Operadores de asignación: Asignan unos objetos a otros del mismo tipo.

Tema 6. Gestión dinámica de memoria 17 / 32 3 Pila con un vector dinámico (V) Constructor stack ( i n t numelem ) { capacidad = numelem ; elementos = new tipobase [ capacidad ] ; i f ( elementos = = 0 ) { c e r r < < " E r r o r a l r e s e r v a r espacio para l a p i l a " < < endl ; e x i t ( 1); tope = 1; stack p ; / / Reserva espacio para 1 2 8 datos de tipobase c i n > > num; stack q (num ) ; / / Reserva espacio para num datos de tipobase

Tema 6. Gestión dinámica de memoria 18 / 32 3 Pila con un vector dinámico (VI) p Destructor capacidad 7 stack p ( 7 ) ; tope elementos -1 Qué ocurre con el objeto al salir de su ámbito? El compilador inserta una llamada al destructor del objeto. La memoria para los datos estáticos (capacidad, tope y el puntero elementos) se libera automáticamente. La memoria dinámica reservada para los elementos NO se libera Necesitamos un destructor que la libere.

Tema 6. Gestión dinámica de memoria 19 / 32 3 Pila con un vector dinámico (VII) Destructor stack ( ) { delete [ ] elementos ; Nombre de la clase precedido por No tiene parámetros Definición única. No devuelve nada (ni void).

Tema 6. Gestión dinámica de memoria 20 / 32 3 Pila con un vector dinámico (VIII) Constructor de copia Qué ocurre cuando:? Inicializamos un objeto stack p i l a 1 ( 1 0 ) ; / / Rellenamos p i l a 1 por teclado stack p i l a 2 = p i l a 1 ; stack p i l a 3 ( p i l a 1 ) ; Pasamos un objeto por valor o lo devuelve una función stack I n v e r t i r ( stack p ) ; El constructor de copia por defecto copia los miembros estáticos del objeto byte a byte (capacidad, tope y el puntero elementos).

Tema 6. Gestión dinámica de memoria 21 / 32 3 Pila con un vector dinámico (IX) stack o t r a p i l a ( p i l a ) ; pila Por defecto pila Constructor correcto capacidad 7 capacidad 7 tope -1 tope -1 elementos elementos otrapila otrapila capacidad 7 capacidad 7 tope -1 tope -1 elementos elementos

Tema 6. Gestión dinámica de memoria 22 / 32 3 Pila con un vector dinámico (X) Constructor de copia stack ( const stack & origen ) { capacidad = origen. capacidad ; elementos = new tipobase [ capacidad ] ; i f ( elementos = = 0 ) { c e r r < < " E r r o r a l r e s e r v a r espacio para l a p i l a " < < endl ; e x i t ( 1); for ( i n t pos = 0 ; pos<capacidad ; pos++) elementos [ pos ] = origen. elementos [ pos ] ; tope = origen. tope ;

Tema 6. Gestión dinámica de memoria 23 / 32 3 Pila con un vector dinámico (XI) Operador de asignación Cuando realizamos una asignación: copiapila = pila ; Si la clase reserva memoria dinámica, incluir un operador de asignación. stack & operator=(const stack &origen); Similar al operador de copia, pero: Debe liberar y reservar la memoria dinámica adecuada para el objeto de la parte izquierda de la asignación. Debe tener en cuenta la autoasignación: pila = pila. Debe devolver la pila que contiene la función: *this.

Tema 6. Gestión dinámica de memoria 24 / 32 3 Pila con un vector dinámico (XII) stack & operator =( const stack & origen ) { i f ( this! = & origen ) { / / E v i t a l a autoasignación delete [ ] elementos ; capacidad = origen. capacidad ; elementos = new tipobase [ capacidad ] ; i f ( elementos = = 0 ) { c e r r < < " E r r o r a l r e s e r v a r espacio para l a p i l a " < < endl ; e x i t ( 1); for ( i n t pos = 0 ; pos<capacidad ; pos++) elementos [ pos ] = origen. elementos [ pos ] ; tope = origen. tope ; return this ;

Tema 6. Gestión dinámica de memoria 25 / 32 3 Pila con un vector dinámico (XIII) Ejemplo de uso void Imprime ( stack p ) {... i n t main ( ) { i n t num; cout < < " Numero de elementos? " ; c i n > > num; stack p (num ) ; / / Constructor for ( i n t i = 0 ; i <num ; i ++) p. push ( i ) ; stack q = p ; / / Constructor de copia Imprime ( q ) ; / / Constructor de copia + d e s t r u c t o r stack u ; / / Constructor u = q ; / / Operador de asignación Imprime ( u ) ; / / Constructor de copia + d e s t r u c t o r / / d e s t r u c t o r + d e s t r u c t o r + d e s t r u c t o r

Tema 6. Gestión dinámica de memoria 26 / 32 4 Pila enlazada Consideraciones Sólo podemos acceder a la pila a través del tope: única posición visible. Pila Puntero al tope. La estructura es ordenada necesitamos un mecanismo de enlace entre un elemento y el siguiente. Cada elemento de la pila estará contenido en un nodo con dos componentes: Nodo elemento puntero al siguiente

Tema 6. Gestión dinámica de memoria 27 / 32 4 Pila enlazada (II) Definición del nodo class nodo { public : tipobase i n f o ; nodo s i g ; / / Constructor nodo ( const tipobase & v a l o r =tipobase ( ), nodo s i g u i e n t e =NULL ) : i n f o ( v a l o r ), s i g ( s i g u i e n t e ) { ; Estructura recursiva: La clase nodo contiene un campo que apunta a un objeto de la misma clase.

Tema 6. Gestión dinámica de memoria 28 / 32 4 Pila enlazada (III) Pila enlazada tope e 8 e 7 e 1 tope e 8 info sig e 7... e 1 TAD

Tema 6. Gestión dinámica de memoria 29 / 32 4 Pila enlazada (IV) Clase pila enlazada class stack { public : / / Constructores y d e s t r u c t o r e s de l a p i l a / / Operaciones : empty, pop, push, top private : class nodo { / / Sólo acceden miembros y amigos de l a p i l a / / datos y c o n s t r u c t o r ; ; nodo tope ; / / P i l a puntero a l nodo tope

Tema 6. Gestión dinámica de memoria 30 / 32 4 Pila enlazada (V) Constructor y destructor stack ( ) { tope = NULL ; stack ( ) { nodo aux ; while (! empty ( ) ) { aux = tope ; tope = aux >s i g ; delete aux ;

Tema 6. Gestión dinámica de memoria 31 / 32 4 Pila enlazada (VI) Operaciones de consulta bool empty ( ) const { return ( tope = = NULL ) ; const tipobase & top ( ) const { i f (! empty ( ) ) return ( tope >i n f o ) ;

Tema 6. Gestión dinámica de memoria 32 / 32 4 Pila enlazada (VII) void push ( tipobase & v a l o r ) { nodo aux = new nodo ( valor, tope ) ; tope = aux ; void pop ( ) { nodo aux ; i f (! empty ( ) ) { aux = tope ; tope = tope >s i g ; delete aux ;