13.01.2015 Views

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

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

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

SHOW MORE
SHOW LESS

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 />

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

Saved successfully!

Ooh no, something went wrong!