13.2.2 对指针的清除责任

为了使Stash和Stack容器具有灵活性(可以包含任意类型的对象),要使用void指针。这意味着当一个指针从Stash或Stack对象返回时,必须在使用之前把它转换为适当的类型。如上所示,在删除它之前也必须把它转换为适当的类型,否则将会丢失内存。

解决内存泄漏的另一个工作在于确保对容器中的每一个对象调用delete。容器含有void*类型指针,因此不能正确地执行清除,所以容器自己不能“管理“指针。于是用户必须负责清除这些对象。如果把指向在栈上创建的对象的指针和指向在堆上创建的对象的指针都存放在同一个容器中,将会发生严重的问题。(当从容器中取回一个指针时,我们如何才能知道它所指向的对象是被分配在哪块内存上的呢?)因此不管是通过精心的设计或是通过只作用在堆上的类创建,我们都必须保证存储在如下版本的Stash和Stack上的对象仅是在堆上创建的。

保证由客户程序员负责清除容器中的所有指针同样是很重要的。在前面的例子中,已经看到Stack类是如何在它的析构函数中检查所有的Link对象已经出栈了的。但对于Stash,需要使用另一种方法。