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 377 — #415<br />

✐<br />

13: Creación dinámica de objetos<br />

A veces se conoce la cantidad exacta exacta, el tipo y duración de<br />

la vida de los objetos <strong>en</strong> un programa, pero no siempre es así.<br />

¿Cuántos aviones t<strong>en</strong>drá que supervisar un sistema de control de tráfico aéreo<br />

¿Cuántas formas o figuras se usarán <strong>en</strong> un sistema CAD ¿Cuántos nodos habrá <strong>en</strong><br />

una red<br />

Para resolver un problema g<strong>en</strong>eral de programación, es es<strong>en</strong>cial poder crear y<br />

destruir objetos <strong>en</strong> tiempo de ejecución. Por supuesto, C proporciona las funciones<br />

de asignación dinámica de memoria malloc() y sus variantes, y free(), que permit<strong>en</strong><br />

obt<strong>en</strong>er y liberar bloques <strong>en</strong> el espacio de memoria del montículo (también<br />

llamado espacio libre 1 mi<strong>en</strong>tras se ejecuta el programa.<br />

Este método sin embargo, no funcionará <strong>en</strong> <strong>C++</strong>. El constructor no le permite<br />

manipular la dirección de memoria a inicializar, y con motivo. De permitirse, sería<br />

posible:<br />

1. Olvidar la llamada al constructor. Con lo cual no sería posible garantizar la<br />

inicialización de los objetos <strong>en</strong> <strong>C++</strong>.<br />

2. Usar accid<strong>en</strong>talm<strong>en</strong>te un objeto que aún no ha sido inicializado, esperando que<br />

todo vaya bi<strong>en</strong>.<br />

3. Manipular un objeto de tamaño incorrecto.<br />

Y por supuesto, incluso si se hizo todo correctam<strong>en</strong>te, cualquiera que modifique<br />

el programa estaría expuesto a cometer esos mismos errores. Una gran parte de los<br />

problemas de programación ti<strong>en</strong><strong>en</strong> su orig<strong>en</strong> <strong>en</strong> la inicialización incorrecta de objetos,<br />

lo que hace especialm<strong>en</strong>te importante garantizar la llamada a los constructores<br />

para los objetos que han de ser creados <strong>en</strong> el montículo.<br />

¿Cómo se garantiza <strong>en</strong> <strong>C++</strong> la correcta inicialización y limpieza, permiti<strong>en</strong>do la<br />

creación dinámica de objetos<br />

La respuesta está <strong>en</strong> integrar <strong>en</strong> el l<strong>en</strong>guaje mismo la creación dinámica de objetos.<br />

malloc() y free() son funciones de biblioteca y por tanto, están fuera del<br />

control del compilador. Si se dispone de un operador que lleve a cabo el acto combinado<br />

de la asignación dinámica de memoria y la inicialización, y de otro operador que<br />

realice el acto combinado de la limpieza y de liberación de memoria, el compilador<br />

podrá garantizar la llamada a los constructores y destructores de los objetos.<br />

En este capítulo verá cómo se resuelve de modo elegante este problema con los<br />

operadores new y delete de <strong>C++</strong>.<br />

1 N.T. espacio de almac<strong>en</strong>ami<strong>en</strong>to libre (free store)<br />

377<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!