13.2.2. Responsabilidad de la limpieza cuando se usan punteros

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.