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