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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 393 — #431<br />

✐<br />

13.3. new y delete para vectores<br />

3 . Usar printf() evita el fatal bloqueo, ya que no hace llamadas a new.<br />

En main(), se crean algunos objetos de tipos básicos para demostrar que también<br />

<strong>en</strong> estos casos se llama a los operadores new y delete sobrecargados. Posteriorm<strong>en</strong>te,<br />

se crean un objeto simple y un vector, ambos de tipo S. En el caso del<br />

vector se puede ver, por el número de bytes pedidos, que se solicita algo de memoria<br />

extra para incluir información sobre el número de objetos que t<strong>en</strong>drá. En todos los<br />

casos se efectúa la llamada a las versiones globales sobrecargadas de new y delete.<br />

Sobrecarga de new y delete específica para una clase<br />

Aunque no es necesario poner el modificador static, cuando se sobrecarga n-<br />

ew y delete para una clase se están creando métodos estáticos (métodos de clase).<br />

La sintaxis es la misma que para cualquier otro operador. Cuando el compilador<br />

<strong>en</strong>cu<strong>en</strong>tra una expresión new para crear un objeto de una clase, elige, si existe, un<br />

método de la clase llamado operator new() <strong>en</strong> lugar del new global. Para el resto<br />

de tipos o clases se usan los operadores globales (a m<strong>en</strong>os que t<strong>en</strong>gan definidos los<br />

suyos propios).<br />

En el sigui<strong>en</strong>te ejemplo se usa un primitivo sistema de asignación de almac<strong>en</strong>ami<strong>en</strong>to<br />

para la clase Framis. Se reserva un bloque de memoria <strong>en</strong> el área de datos<br />

estática FIXME , y se usa esa memoria para asignar alojami<strong>en</strong>to para los objetos de<br />

tipo Framis. Para determinar qué bloques se han asignado, se usa un s<strong>en</strong>cillo vector<br />

de bytes, un byte por bloque.<br />

//: C13:Framis.cpp<br />

// Local overloaded new & delete<br />

#include // Size_t<br />

#include <br />

#include <br />

#include <br />

using namespace std;<br />

ofstream out("Framis.out");<br />

class Framis {<br />

<strong>en</strong>um { sz = 10 };<br />

char c[sz]; // To take up space, not used<br />

static unsigned char pool[];<br />

static bool alloc_map[];<br />

public:<br />

<strong>en</strong>um { psize = 100 }; // frami allowed<br />

Framis() { out

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

Saved successfully!

Ooh no, something went wrong!