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