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 397 — #435<br />
✐<br />
13.3. new y delete para vectores<br />
El constructor y el destructor simplem<strong>en</strong>te imprim<strong>en</strong> m<strong>en</strong>sajes para que pueda<br />
verse que han sido llamados. A continuación se muestran dichos m<strong>en</strong>sajes:<br />
new Widget<br />
Widget::new: 40 bytes<br />
*<br />
delete Widget<br />
~Widget::delete<br />
new Widget[25]<br />
Widget::new: 1004 bytes<br />
*************************<br />
delete []Widget<br />
~~~~~~~~~~~~~~~~~~~~~~~~~Widget::delete[]<br />
La creación de un único objeto Widget requiere 40 bytes, tal y como se podría<br />
esperar para una máquina que usa 32 bits para un int. Se invoca al operator new()<br />
y luego al constructor, que se indica con la impresión del carácter «*». De forma<br />
complem<strong>en</strong>taria, la llamada a delete provoca primero la invocación del destructor<br />
y sólo después, la de operator delete().<br />
Cuando lo que se crea es un vector de objetos Widget, se observa el uso de la versión<br />
de operator new() para vectores, de acuerdo con lo dicho anteriorm<strong>en</strong>te. Se<br />
observa que el tamaño del bloque solicitado <strong>en</strong> este caso es cuatro bytes mayor que el<br />
esperado. Es <strong>en</strong> estos cuatro bytes extra donde el compilador guarda la información<br />
sobre el tamaño del vector. De ese modo, la expresión<br />
delete []Widget;<br />
informa al compilador que se trata de un vector, con lo cual, g<strong>en</strong>erará el código<br />
para extraer la información que indica el número de objetos y para llamar otras<br />
tantas veces al destructor. Obsérvese que aunque se llame solo una vez a operator<br />
new() y operator delete() para el vector, se llama al constructor y al destructor<br />
una vez para cada uno de los objetos del vector.<br />
Llamadas al constructor<br />
Considerando que<br />
MyType* f = new MyType;<br />
llama a new para obt<strong>en</strong>er un bloque del tamaño de MyType invocando después<br />
a su constructor, ¿qué pasaría si la asignación de memoria falla <strong>en</strong> new. En tal caso,<br />
no habrá llamada al constructor al que se le t<strong>en</strong>dría que pasar un puntero this nulo,<br />
para un objeto que no se ha creado . He aquí un ejemplo que lo demuestra:<br />
//: C13:NoMemory.cpp<br />
// Constructor isn’t called if new fails<br />
#include <br />
#include // bad_alloc definition<br />
using namespace std;<br />
class NoMemory {<br />
public:<br />
NoMemory() {<br />
cout