allocator 的使用方法
C++标准库中的Allocator有一个复杂而低层次的接口[注1]。和new与delete不同,它们将内存分配与对象构造解耦。和malloc与free不同,它们要求你明确正在分配的内存的数据类型和对象数目。
通 常,这不成为问题。Allocator拥有低层次的接口是因为它们是低层次的概念:它们通常隐藏在容器类内部,而不属于普通用户的代码。然而,有时你可能 不得不关心allocator:当你自己写一个新的容器类的时候。Allocator比new/delete难用多了,因此,更容易发生错误。如果你写的 代码不得不使用allocator,如何确保代码正确?运行期的测试不能证明不存在错误,只能证明错误的存在。尽管如此,测试还是很重要--你越快发现 bug,它就越早被修正。
所 有的标准容器类都接受一个allocator类作为其模板参数;这个参数有一个默认值,比如std::vector<int>是 vector<int,std:: allocator<int> >的简写。如果我们写了一个有额外正确性检查的alocator类,那就可以用它代替std::allocator<int>来作为 vector的第二模板参数。如果没有bug的话,vector的行为将会和以前一样。(当然,除了额外的检查将使它变慢。)
这篇文章将展示这样一个debugging allocator类。它在其适用范围内是有价值的,并且实现它也是使用allocator的一个有趣练习。