Para hacer que los contenedores Stack
y
Stash
sean flexibles, capaces de recibir cualquier tipo de
objeto, se usan punteros de tipo void*
. Esto hace necesario convertir
al tipo adecuado los punteros devueltos por las clases
Stash
y Stack
, antes de que sean
usados. Hemos visto en la sección anterior, que los punteros deben ser convertidos
al tipo correcto incluso antes de ser entregados a delete
, para evitar
posibles fugas de memoria.
Hay otro problema, derivado de la necesidad de llamar a delete
para cada
puntero a objeto almacenado en el contenedor. El contenedor no puede realizar la
limpieza para los punteros que almacena puesto que son punteros
void*
. Esto puede derivar en un serio problema si a un contenedor se
le pasan punteros a objetos automáticos junto con punteros a objetos dinámicos; el
resultado de usar delete
sobre un puntero que no haya sido obtenido del
montículo es imprevisible. Más aún, al obtener del contenedor un puntero
cualquiera, existirán dudas sobre el origen, automático, dinámico o estático, del
objeto al que apunta. Esto implica que hay que asegurarse del origen dinámico de
los punteros que se almacenen en la siguiente versión de
Stash
y Stack
, bien sea mediante una
programación cuidadosa, o bien por la creación de clases que sólo puedan ser
construidas en el montículo.
Es muy importante asegurarse también de que el programador cliente se
responsabilice de la limpieza de los punteros del contenedor. Se ha visto en
ejemplos anteriores que la clase Stack
comprobaba en su
destructor que todos los objetos Link
habían sido
desapilados. Un objeto Stash
para punteros requiere un modo
diferente de abordar el problema.