Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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