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 401 — #439<br />

✐<br />

13.5. Ejercicios<br />

su destructor.<br />

4. Cree un vector de Counted* y cárguelo con punteros a objetos Counted. Recorra<br />

el vector llamando imprimi<strong>en</strong>do cada objeto, repita este paso y elimínelos<br />

uno a uno.<br />

5. Repita el ejercicio 4 añadi<strong>en</strong>do una función miembro f() de Counted que<br />

muestre un m<strong>en</strong>saje. Recorra el vector llamando a f() para cada objeto del<br />

vector.<br />

6. Repita el ejercicio 5 usando un objeto PStash.<br />

7. Repita el ejercicio 5 usando Stack4.h del capítulo 9.<br />

8. Cree mediante asignación dinámica un vector de objetos de clase Counted.<br />

Llame a delete con el puntero resultante como argum<strong>en</strong>to, sin usar el operador<br />

subíndice []. Explique el resultado.<br />

9. Cree un objeto de clase Counted mediante new, convierta el puntero resultante<br />

a void* y luego bórrelo. Explique el resultado.<br />

10. Compile y ejecute el programa NewHandler.cpp <strong>en</strong> su ord<strong>en</strong>ador. A partir<br />

del número resultante, calcule la cantidad de memoria libre disponible para su<br />

programa.<br />

11. Cree una clase y defina <strong>en</strong> ella operadores de sobrecarga para new y delete,<br />

para objetos simples y para vectores de objetos. Demuestre que ambas<br />

versiones funcionan.<br />

12. Diseñe un test que le permita evaluar de forma aproximada la mejora <strong>en</strong> velocidad<br />

obt<strong>en</strong>ida <strong>en</strong> Framis.cpp con el uso de las versiones adaptadas de new<br />

y delete, respecto de la obt<strong>en</strong>ida con las globales .<br />

13. Modifique NoMemory.cpp para que cont<strong>en</strong>ga un vector de <strong>en</strong>teros y realm<strong>en</strong>te<br />

obt<strong>en</strong>ga memoria <strong>en</strong> lugar de disparar bad_alloc. Establezca un bucle w-<br />

hile <strong>en</strong> el cuerpo de main() similar al que existe <strong>en</strong> NewHandler.cpp para<br />

agotar la memoria. Observe lo que sucede <strong>en</strong> el caso de que su operador n-<br />

ew no compruebe el éxito de la asignación de memoria. Añada después esa<br />

comprobación a su operador new y la llamada a throw bad_alloc.<br />

14. Cree una clase y defina un operador new de emplazami<strong>en</strong>to, con un string como<br />

segundo argum<strong>en</strong>to. Defina un vector de string, <strong>en</strong> el que se almac<strong>en</strong>ará<br />

este segundo argum<strong>en</strong>to a cada llamada a new. El operador new de emplazami<strong>en</strong>to<br />

asignará bloques de manera normal. En main(), haga llamadas a este<br />

operador new pasándole como argum<strong>en</strong>tos cad<strong>en</strong>as de caracteres que describan<br />

las llamadas. Para ello, puede hacer uso de las macros __FILE__ y __L-<br />

INE__ del preprocesador.<br />

15. Modifique ArrayOperatorNew.cpp defini<strong>en</strong>do un vector estático de Widget*<br />

que añada la dirección de cada uno de los objetos Widget asignados con<br />

new, y la retire cuando sea liberada mediante delete. Puede que necesite buscar<br />

información sebre vectores <strong>en</strong> la docum<strong>en</strong>tación de la biblioteca estándar<br />

de <strong>C++</strong>, o <strong>en</strong> el segundo volum<strong>en</strong> de este libro que está disponible <strong>en</strong> la web<br />

del autor. Cree una segunda clase a la que llamará MemoryChecker, que cont<strong>en</strong>ga<br />

un destructor que muestre el número de punteros a Widget <strong>en</strong> su vector.<br />

Diseñe un programa con una única instancia global de MemoryChecker, y <strong>en</strong><br />

main(), cree y destruya dinámicam<strong>en</strong>te varios objetos y vectores de objetos<br />

Widget. Observe que MemoryCheck revela fugas de memoria.<br />

401<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!