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

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

Saved successfully!

Ooh no, something went wrong!