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