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