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 389 — #427<br />

✐<br />

13.3. new y delete para vectores<br />

creó, y llamar al destructor para cada uno de dichos elem<strong>en</strong>tos. Esta es una mejora<br />

sobre la sintaxis primitiva, que puede verse ocasionalm<strong>en</strong>te <strong>en</strong> el código de viejos<br />

programas:<br />

delete [100] fp;<br />

que forzaba al programador a incluir el número de objetos cont<strong>en</strong>idos <strong>en</strong> el vector,<br />

introduci<strong>en</strong>do con ello una posible fu<strong>en</strong>te de errores. El esfuerzo adicional que<br />

supone para el compilador t<strong>en</strong>er <strong>en</strong> esto <strong>en</strong> cu<strong>en</strong>ta es pequeño, y por eso se consideró<br />

preferible especificar el número de objetos <strong>en</strong> un lugar y no <strong>en</strong> dos.<br />

13.3.1. Cómo hacer que un puntero sea más parecido a un<br />

vector<br />

Como defecto colateral, existe la posibilidad de modificar el puntero fp anteriorm<strong>en</strong>te<br />

definido, para que apunte a cualquier otra cosa, lo que no es consist<strong>en</strong>te con<br />

el hecho de ser la dirección de inicio de un vector. Ti<strong>en</strong>e más s<strong>en</strong>tido definirlo como<br />

una constante, de modo que cualquier int<strong>en</strong>to de modificación sea señalado como<br />

un error. Para conseguir este efecto se podría probar con:<br />

int const* q = new int[10];<br />

o bi<strong>en</strong>:<br />

const int* q = new int[10];<br />

pero <strong>en</strong> ambos casos el especificador const quedaría asociado al int, es decir,<br />

al valor al que apunta, <strong>en</strong> lugar de al puntero <strong>en</strong> sí. Si se quiere conseguir el efecto<br />

deseado, <strong>en</strong> lugar de las anteriores, se debe poner:<br />

int* const q = new int[10];<br />

Ahora es posible modificar el valor de los elem<strong>en</strong>tos del vector, si<strong>en</strong>do ilegal cualquier<br />

int<strong>en</strong>to posterior de modificar q, como q++ por ejemplo, al igual que ocurre con<br />

el id<strong>en</strong>tificador de un vector ordinario.<br />

13.3.2. Cuando se supera el espacio de almac<strong>en</strong>ami<strong>en</strong>to<br />

¿Qué ocurre cuando new() no puede <strong>en</strong>contrar un bloque contiguo sufici<strong>en</strong>tem<strong>en</strong>te<br />

grande para alojar el objeto En este caso se produce la llamada a una función<br />

especial: el manejador de errores de new o new-handler. Para ello comprueba si un<br />

determinado puntero a función es nulo, si no lo es, se efectúa la llamada a la función<br />

a la que apunta.<br />

El comportami<strong>en</strong>to por defecto del manejador de errores de new es disparar una<br />

excepción, asunto del que se tratará <strong>en</strong> el Volum<strong>en</strong> 2. Si se pi<strong>en</strong>sa usar la asignación<br />

dinámica, convi<strong>en</strong>e al m<strong>en</strong>os reemplazar el manejador de errores de new por una<br />

función que advierta de la falta de memoria y fuerce la terminación del programa.<br />

De este modo, durante la depuración del programa, se podrá seguir la pista de lo sucedido.<br />

Para la versión final del programa, será mejor implem<strong>en</strong>tar una recuperación<br />

de errores más elaborada.<br />

389<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!