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

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

Saved successfully!

Ooh no, something went wrong!