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 388 — #426<br />

✐<br />

Capítulo 13. Creación dinámica de objetos<br />

delete intStash.remove(k);<br />

En cambio, para los punteros a string, hace falta la conversión de tipo, so p<strong>en</strong>a de<br />

crear otra (sil<strong>en</strong>ciosa) fuga de memoria, de modo que el molde es es<strong>en</strong>cial:<br />

delete (string*) stringStash.remove(k);<br />

Algunas de estas dificultades pued<strong>en</strong> resolverse mediante el uso de plantillas,<br />

que veremos <strong>en</strong> el capítulo 16. FIXME:ref<br />

13.3. new y delete para vectores<br />

En <strong>C++</strong> es igual de fácil crear vectores de objetos <strong>en</strong> la pila o <strong>en</strong> el montículo, con<br />

la certeza de que se producirá la llamada al constructor para cada uno de los objetos<br />

del vector. Hay una restricción: debe existir un constructor por defecto, o sea, sin<br />

argum<strong>en</strong>tos, que será invocado para cada objeto.<br />

Cuando se crean vectores de objetos dinámicam<strong>en</strong>te, usando new, hay otras cosas<br />

que hay que t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta. Como ejemplo de este tipo de vectores véase<br />

MyType* fp = new MyType[100];<br />

Esta s<strong>en</strong>t<strong>en</strong>cia asigna espacio sufici<strong>en</strong>te <strong>en</strong> el montículo para 100 objetos MyType<br />

y llama al constructor para cada uno de ellos. Lo que se ha obt<strong>en</strong>ido es simplem<strong>en</strong>te<br />

un MyType*, exactam<strong>en</strong>te lo mismo que hubiera obt<strong>en</strong>ido de esta otra forma, que<br />

crea un único objeto:<br />

MyType* fp2 = new MyType;<br />

El escritor del programa sabe que fp es la dirección del primer elem<strong>en</strong>to de un<br />

vector, por lo que ti<strong>en</strong>e s<strong>en</strong>tido seleccionar elem<strong>en</strong>tos del mismo mediante una expresión<br />

como fp[3], pero ¿qué pasa cuando destruimos el vector. Las s<strong>en</strong>t<strong>en</strong>cias<br />

delete fp2;<br />

delete fp;<br />

// Correcta<br />

// Ésta no át<strong>en</strong>dr el efecto deseado<br />

parec<strong>en</strong> iguales, y sus efectos serán los mismos. Se llamará al destructor del objeto<br />

MyType al que apunta el puntero dado y después se liberará el bloque asignado. Esto<br />

es correcto para fp2, pero no lo es para fp, significa que los destructores de los 99<br />

elem<strong>en</strong>tos restantes del vector no se invocarán. Sin embargo, sí se liberará toda la<br />

memoria asignada al vector, ya que fue obt<strong>en</strong>ida como un único gran bloque cuyo<br />

tamaño quedó anotado <strong>en</strong> alguna parte por las rutinas de asignación.<br />

Esto se soluciona indicando al compilador que el puntero que pasamos es la dirección<br />

de inicio de un vector, usando la sigui<strong>en</strong>te sintaxis:<br />

delete [] fp;<br />

Los corchetes indican al compilador la necesidad de g<strong>en</strong>erar el código para obt<strong>en</strong>er<br />

el número de objetos <strong>en</strong> el vector, que fue guardado <strong>en</strong> alguna parte cuando se<br />

388<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!