Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 378 — #416 ✐ Capítulo 13. Creación dinámica de objetos 13.1. Creación de objetos La creación de un objeto en C++ tiene lugar en dos pasos: 1. Asignación de memoria para el objeto. 2. Llamada al constructor. Aceptemos por ahora que este segundo paso ocurre siempre. C++ lo fuerza, debido a que el uso de objetos no inicializados es una de las causas más frecuentes de errores de programación. Siempre se invoca al constructor, sin importar cómo ni dónde se crea el objeto. El primero de estos pasos puede ocurrir de varios modos y en diferente momento: 1. Asignación de memoria en la zona de almacenamiento estático, que tiene lugar durante la carga del programa. El espacio de memoria asignado al objeto existe hasta que el programa termina. 2. Asignación de memoria en la pila, cuando se alcanza algún punto determinado durante la ejecución del programa (la llave de apertura de un bloque). La memoria asignada se vuelve a liberar de forma automática en cuanto se alcanza el punto de ejecución complementario (la llave de cierre de un bloque). Las operaciones de manipulación de la pila forman parte del conjunto de instrucciones del procesador y son muy eficientes. Por otra parte, es necesario saber cuantas variables se necesitan mientras se escribe el programa de modo que el copilador pueda generar el código correspondiente. 3. Asignación dinámica, en una zona de memoria libre llamada montículo (heap o free store). Se reserva espacio para un objeto en esta zona mediante la llamada a una función durante la ejecución del programa; esto significa que se puede decidir en cualquier momento que se necesita cierta cantidad de memoria. Esto conlleva la responsabilidad de determinar el momento en que ha de liberarse la memoria, lo que implica determinar el tiempo de vida de la misma que, por tanto, ya no está bajo control de las reglas de ámbito. A menudo, las tres regiones de memoria referidas se disponen en una zona contigua de la memoria física: área estática, la pila, y el montículo, en un orden determinado por el escritor del compilador. No hay reglas fijas. La pila puede estar en una zona especial, y puede que las asignaciones en el montículo se obtengan mediante petición de bloques de la memoria del sistema operativo. Estos detalles quedan normalmente ocultos al programador puesto que todo lo que se necesita conocer al respecto es que esa memoria estará disponible cuando se necesite. 13.1.1. Asignación dinámica en C C proporciona las funciones de su biblioteca estándar malloc() y sus variantes calloc() y realloc() para asignar, y free() para liberar bloques de memoria dinámicamente en tiempo de ejecución. Estas funciones son pragmáticas pero rudimentarias por lo que requieren comprensión y un cuidadoso manejo por parte del programador. El listado que sigue es un ejemplo que ilustra el modo de crear una instancia de una clase con estas funciones de C: //: C13:MallocClass.cpp 378 ✐ ✐ ✐ ✐

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 379 — #417 ✐ 13.1. Creación de objetos // Malloc with class objects // What you’d have to do if not for "new" #include "../require.h" #include // malloc() & free() #include // memset() #include using namespace std; class Obj { int i, j, k; enum { sz = 100 }; char buf[sz]; public: void initialize() { // Can’t use constructor cout

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 378 — #416<br />

✐<br />

Capítulo 13. Creación dinámica de objetos<br />

13.1. Creación de objetos<br />

La creación de un objeto <strong>en</strong> <strong>C++</strong> ti<strong>en</strong>e lugar <strong>en</strong> dos pasos:<br />

1. Asignación de memoria para el objeto.<br />

2. Llamada al constructor.<br />

Aceptemos por ahora que este segundo paso ocurre siempre. <strong>C++</strong> lo fuerza, debido<br />

a que el uso de objetos no inicializados es una de las causas más frecu<strong>en</strong>tes<br />

de errores de programación. Siempre se invoca al constructor, sin importar cómo ni<br />

dónde se crea el objeto.<br />

El primero de estos pasos puede ocurrir de varios modos y <strong>en</strong> difer<strong>en</strong>te mom<strong>en</strong>to:<br />

1. Asignación de memoria <strong>en</strong> la zona de almac<strong>en</strong>ami<strong>en</strong>to estático, que ti<strong>en</strong>e lugar<br />

durante la carga del programa. El espacio de memoria asignado al objeto existe<br />

hasta que el programa termina.<br />

2. Asignación de memoria <strong>en</strong> la pila, cuando se alcanza algún punto determinado<br />

durante la ejecución del programa (la llave de apertura de un bloque). La<br />

memoria asignada se vuelve a liberar de forma automática <strong>en</strong> cuanto se alcanza<br />

el punto de ejecución complem<strong>en</strong>tario (la llave de cierre de un bloque). Las<br />

operaciones de manipulación de la pila forman parte del conjunto de instrucciones<br />

del procesador y son muy efici<strong>en</strong>tes. Por otra parte, es necesario saber<br />

cuantas variables se necesitan mi<strong>en</strong>tras se escribe el programa de modo que el<br />

copilador pueda g<strong>en</strong>erar el código correspondi<strong>en</strong>te.<br />

3. Asignación dinámica, <strong>en</strong> una zona de memoria libre llamada montículo (heap<br />

o free store). Se reserva espacio para un objeto <strong>en</strong> esta zona mediante la llamada<br />

a una función durante la ejecución del programa; esto significa que se puede<br />

decidir <strong>en</strong> cualquier mom<strong>en</strong>to que se necesita cierta cantidad de memoria. Esto<br />

conlleva la responsabilidad de determinar el mom<strong>en</strong>to <strong>en</strong> que ha de liberarse<br />

la memoria, lo que implica determinar el tiempo de vida de la misma que, por<br />

tanto, ya no está bajo control de las reglas de ámbito.<br />

A m<strong>en</strong>udo, las tres regiones de memoria referidas se dispon<strong>en</strong> <strong>en</strong> una zona contigua<br />

de la memoria física: área estática, la pila, y el montículo, <strong>en</strong> un ord<strong>en</strong> determinado<br />

por el escritor del compilador. No hay reglas fijas. La pila puede estar <strong>en</strong> una<br />

zona especial, y puede que las asignaciones <strong>en</strong> el montículo se obt<strong>en</strong>gan mediante<br />

petición de bloques de la memoria del sistema operativo. Estos detalles quedan<br />

normalm<strong>en</strong>te ocultos al programador puesto que todo lo que se necesita conocer al<br />

respecto es que esa memoria estará disponible cuando se necesite.<br />

13.1.1. Asignación dinámica <strong>en</strong> C<br />

C proporciona las funciones de su biblioteca estándar malloc() y sus variantes<br />

calloc() y realloc() para asignar, y free() para liberar bloques de memoria<br />

dinámicam<strong>en</strong>te <strong>en</strong> tiempo de ejecución. Estas funciones son pragmáticas pero rudim<strong>en</strong>tarias<br />

por lo que requier<strong>en</strong> compr<strong>en</strong>sión y un cuidadoso manejo por parte del<br />

programador. El listado que sigue es un ejemplo que ilustra el modo de crear una<br />

instancia de una clase con estas funciones de C:<br />

//: C13:MallocClass.cpp<br />

378<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!