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. Como se ha visto en la sección anterior, los punteros deben ser convertidos al tipo correcto incluso antes de ser entregados a delete, para evitar posibles fugas de memoria.

El otro problema de fugas de memoria tiene que ver con asegurarse de que realmente se llama a delete para cada puntero a objeto almacenado en el contenedor. El contenedor no puede «poseer» los punteros porque los almacena como void* y, por tanto, no puede realizar la limpieza adecuada. El usuario debe responsabilizarse de la limpieza de los objetos. 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 las siguientes versiones 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.