Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 400 — #438<br />
✐<br />
Capítulo 13. Creación dinámica de objetos<br />
Hay que hacer una llamada de at<strong>en</strong>ción al respecto. Algunas personas v<strong>en</strong> esto<br />
como un modo de destruir objetos <strong>en</strong> algún mom<strong>en</strong>to anterior al determinado por las<br />
reglas de ámbito, <strong>en</strong> lugar de ajustar el ámbito, o más correctam<strong>en</strong>te, <strong>en</strong> lugar de usar<br />
asignación dinámica como medio de determinar la duración del objeto <strong>en</strong> tiempo de<br />
ejecución. Esto es un error, que puede provocar problemas si se trata de destruir de<br />
esta manera un objeto ordinario creado <strong>en</strong> la pila, ya que el destructor será llamado<br />
de nuevo cuando se produzca la salida del ámbito correspondi<strong>en</strong>te. Si se llama de<br />
esta forma directa al destructor de un objeto creado dinámicam<strong>en</strong>te, se llevará a cabo<br />
la destrucción, pero no la liberación del bloque de memoria, lo que probablem<strong>en</strong>te<br />
no es lo que se desea. La única razón para este tipo de llamada explícita al destructor<br />
es permitir este uso especial del operador new, para emplazami<strong>en</strong>to <strong>en</strong> memoria.<br />
Existe también una forma de operador delete de emplazami<strong>en</strong>to que sólo es<br />
llamada <strong>en</strong> caso de que el constructor dispare una excepción, con lo que la memoria<br />
se libera automáticam<strong>en</strong>te durante la excepción. El operador delete de emplazami<strong>en</strong>to<br />
usa una lista de argum<strong>en</strong>tos que se corresponde con la del operador new de<br />
emplazami<strong>en</strong>to que fue llamado previam<strong>en</strong>te a que el constructor lanzase la excepción.<br />
Este asunto se tratará <strong>en</strong> el Volum<strong>en</strong> 2, <strong>en</strong> un capítulo dedicado al tratami<strong>en</strong>to<br />
de excepciones.<br />
13.4. Resum<strong>en</strong><br />
La creación de objetos <strong>en</strong> la pila es eficaz y conv<strong>en</strong>i<strong>en</strong>te, pero para resolver el<br />
problema g<strong>en</strong>eral de programación es necesario poder crear y destruir objetos <strong>en</strong><br />
cualquier mom<strong>en</strong>to <strong>en</strong> tiempo de ejecución, <strong>en</strong> particular, para que pueda responder<br />
a la información externa al programa. Aunque C ofrece funciones de asignación dinámica,<br />
éstas no proporcionan la facilidad de uso ni la construcción garantizada de<br />
objetos que se necesita <strong>en</strong> <strong>C++</strong>. Al llevar al núcleo mismo del l<strong>en</strong>guaje gracias al uso<br />
de los operadores new y delete, la creación dinámica de objetos se hace tan fácil<br />
como la creación de objetos <strong>en</strong> la pila, añadi<strong>en</strong>do además una gran flexibilidad. Se<br />
puede modificar el comportami<strong>en</strong>to de new y delete si no se ajusta a los requerimi<strong>en</strong>tos,<br />
particularm<strong>en</strong>te para mejorar la efici<strong>en</strong>cia, y también es posible definir su<br />
comportami<strong>en</strong>to <strong>en</strong> caso de agotarse la memoria libre.<br />
13.5. Ejercicios<br />
Las soluciones a los ejercicios se pued<strong>en</strong> <strong>en</strong>contrar <strong>en</strong> el docum<strong>en</strong>to electrónico<br />
titulado «The Thinking in <strong>C++</strong> Annotated Solution Guide», disponible por poco<br />
dinero <strong>en</strong> www.BruceEckel.com.<br />
1. Crear una clase Counted que cont<strong>en</strong>ga un int id y un static int count.<br />
El constructor por defecto debe empezar con Counted():id(count++){.<br />
También deberá mostrar m<strong>en</strong>sajes con su id, además de alguno que muestre<br />
que se está creando. El destructor debe mostrar que está si<strong>en</strong>do destruido y su<br />
id. Probar su funcionami<strong>en</strong>to.<br />
2. Compruebe que new y delete llaman siempre a constructores y destructores,<br />
creando mediante el uso de new un objeto de la clase Counted del ejercicio 1,<br />
y destruyéndolo después con delete. Cree y destruya un vector de Counted<br />
<strong>en</strong> el montículo.<br />
3. Cree un objeto de la clase PStash, y llénelo de los objetos del ejercicio 1. Observe<br />
lo que sucede cuando el objeto PStash sale de su ámbito y es llamado<br />
400<br />
✐<br />
✐<br />
✐<br />
✐