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 380 — #418<br />
✐<br />
Capítulo 13. Creación dinámica de objetos<br />
que el usuario puede olvidar inicializar el objeto antes de usarlo, introduci<strong>en</strong>do así<br />
una importante fu<strong>en</strong>te de problemas.<br />
Como consecu<strong>en</strong>cia, muchos programadores <strong>en</strong>cu<strong>en</strong>tran muy confusas y complicadas<br />
las funciones de asignación dinámica de la memoria <strong>en</strong> C. No es muy difícil<br />
<strong>en</strong>contrar programadores que, usando máquinas con memoria virtual, usan vectores<br />
<strong>en</strong>ormes <strong>en</strong> el área de almac<strong>en</strong>ami<strong>en</strong>to estático para evitar t<strong>en</strong>er que tratar con la<br />
asignación dinámica. Dado que <strong>C++</strong> int<strong>en</strong>ta facilitar el uso de la biblioteca a los programadores<br />
ocasionales, no es aceptable la forma de abordar la asignación dinámica<br />
<strong>en</strong> C.<br />
13.1.2. El operador new<br />
La solución que ofrece <strong>C++</strong> consiste <strong>en</strong> combinar la serie de acciones necesarias<br />
para la creación de un objeto <strong>en</strong> un único operador llamado >new. Cuando se crea<br />
un objeto mediante el operador >new, éste se <strong>en</strong>carga de obt<strong>en</strong>er el espacio necesario<br />
para el objeto y de llamar a su constructor. Cuando se ejecuta el código:<br />
MyType *fp = new MyType(1,2);<br />
se asigna espacio mediante alguna llamada equival<strong>en</strong>te a >malloc(sizeof(MyType))<br />
--con frecu<strong>en</strong>cia es así, literalm<strong>en</strong>te--, y usando la dirección obt<strong>en</strong>ida como<br />
puntero >this, y (1, 2) como argum<strong>en</strong>tos, se llama al constructor de la clase M-<br />
yType. Para cuando está disponible, el valor de retorno de new es ya un puntero<br />
válido a un objeto inicializado. Además es del tipo correcto, lo que hace innecesaria<br />
la conversión.<br />
El operador new por defecto, comprueba el éxito o fracaso de la asignación de<br />
memoria como paso previo a la llamada al constructor, haci<strong>en</strong>do innecesaria y redundante<br />
la posterior comprobación. Más adelante <strong>en</strong> este capítulo se verá qué sucede<br />
si se produce este fallo.<br />
En las expresiones con new se puede usar cualquiera de los constructores disponibles<br />
para una clase. Si éste no ti<strong>en</strong>e argum<strong>en</strong>tos, se escribe la expresión sin lista de<br />
argum<strong>en</strong>tos<br />
MyType *fp = new MyType;<br />
Es notable la simpleza alcanzada <strong>en</strong> la creación dinámica de objetos: una única<br />
expresión realiza todo el trabajo de cálculo de tamaño, asignación, comprobaciones<br />
de seguridad y conversión de tipo. Esto hace que la creación dinámica de objetos sea<br />
tan s<strong>en</strong>cilla como la creación <strong>en</strong> la pila.<br />
13.1.3. El operador delete<br />
El complem<strong>en</strong>to a la expresión new es la expresión delete, que primero llama al<br />
destructor y después libera la memoria (a m<strong>en</strong>udo mediante una llamada a free(-<br />
)). El argum<strong>en</strong>to para una expresión con delete debe ser una dirección: un puntero<br />
a objeto creado mediante new.<br />
delete fp;<br />
380<br />
✐<br />
✐<br />
✐<br />
✐