1、概述
以STL运用的角度而言,空间配置器是最不需要介绍的,它总是藏在一切组件的背后,默默工作。整个STL的操作对象都存放在容器之中(vertor、list),而容器一定需要配置空间以放置资料,这就是空间配置器的作用。
虽然STL提供了让我们自定义空间配置器的接口,但是不建议自己定义,因为标准提供的空间配置器是安全的,且效率也不错的。所以我们使用时,一般都会使用默认的配置器。如下:
template <class T, class Alloc = allocator<T> >
class vector {};
vect<int> vec; //这里只传入int类型,使用默认的空间配置器
下面的空间配置器是按照SGI 版本的STL进行讲解的,但是STL的原理是通的。
2、空间配置器的内存分配和释放
通过前面整理C++ new和delete的详解,我们知道C++内存配置操作和释放操作是这样的:
class Foo {...};
Foo* pf = new Foo; //配置内存,然后构造对象
delete pf; //将对象析构,然后释放内存
这其中的 new 内含两个阶段操作:1、调用operator new 配置内存。2、调用构造函数,构造对象内容
delete也内含两个阶段操作:1、调用析构函数。2、调用operator delete 释放内存。
为了精密分工,STL 将这两个阶段操作区分开来。内存配置操作由 成员函数 alloccate() 负责,内存释放由 deallcate() 负责;对象构造由 construct() 负责,对象析构则由 destroy() 负责。
在内存分配的过程