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 384 — #422<br />
✐<br />
Capítulo 13. Creación dinámica de objetos<br />
tero a objeto almac<strong>en</strong>ado <strong>en</strong> el cont<strong>en</strong>edor. El cont<strong>en</strong>edor no puede realizar la limpieza<br />
para los punteros que almac<strong>en</strong>a puesto que son punteros void*. Esto puede<br />
derivar <strong>en</strong> un serio problema si a un cont<strong>en</strong>edor se le pasan punteros a objetos automáticos<br />
junto con punteros a objetos dinámicos; el resultado de usar delete sobre<br />
un puntero que no haya sido obt<strong>en</strong>ido del montículo es imprevisible. Más aún, al<br />
obt<strong>en</strong>er del cont<strong>en</strong>edor un puntero cualquiera, existirán dudas sobre el orig<strong>en</strong>, automático,<br />
dinámico o estático, del objeto al que apunta. Esto implica que hay que<br />
asegurarse del orig<strong>en</strong> dinámico de los punteros que se almac<strong>en</strong><strong>en</strong> <strong>en</strong> la sigui<strong>en</strong>te<br />
versión de Stash y Stack, bi<strong>en</strong> sea mediante una programación cuidadosa, o bi<strong>en</strong><br />
por la creación de clases que sólo puedan ser construidas <strong>en</strong> el montículo.<br />
Es muy importante asegurarse también de que el programador cli<strong>en</strong>te se responsabilice<br />
de la limpieza de los punteros del cont<strong>en</strong>edor. Se ha visto <strong>en</strong> ejemplos<br />
anteriores que la clase Stack comprobaba <strong>en</strong> su destructor que todos los objetos<br />
Link habían sido desapilados. Un objeto Stash para punteros requiere un modo<br />
difer<strong>en</strong>te de abordar el problema.<br />
13.2.3. Stash para punteros<br />
Esta nueva versión de la clase Stash, que llamamos PStash, almac<strong>en</strong>a punteros<br />
a objetos exist<strong>en</strong>tes <strong>en</strong> el montículo, a difer<strong>en</strong>cia de la vieja versión, que guardaba<br />
una copia por valor de los objetos. Usando new y delete, es fácil y seguro almac<strong>en</strong>ar<br />
punteros a objetos creados <strong>en</strong> el montículo.<br />
He aquí el archivo de cabecera para «Stash para punteros»:<br />
//: C13:PStash.h<br />
// Holds pointers instead of objects<br />
#ifndef PSTASH_H<br />
#define PSTASH_H<br />
class PStash {<br />
int quantity; // Number of storage spaces<br />
int next; // Next empty space<br />
// Pointer storage:<br />
void** storage;<br />
void inflate(int increase);<br />
public:<br />
PStash() : quantity(0), storage(0), next(0) {}<br />
~PStash();<br />
int add(void* elem<strong>en</strong>t);<br />
void* operator[](int index) const; // Fetch<br />
// Remove the refer<strong>en</strong>ce from this PStash:<br />
void* remove(int index);<br />
// Number of elem<strong>en</strong>ts in Stash:<br />
int count() const { return next; }<br />
};<br />
#<strong>en</strong>dif // PSTASH_H ///:~<br />
Los elem<strong>en</strong>tos de datos subyac<strong>en</strong>tes no han cambiado mucho, pero ahora el almac<strong>en</strong>ami<strong>en</strong>to<br />
se hace sobre un vector de punteros void, que se obti<strong>en</strong>e mediante<br />
new <strong>en</strong> lugar de malloc(). En la expresión<br />
void** st = new void*[ quantity + increase ];<br />
384<br />
✐<br />
✐<br />
✐<br />
✐