1、概述
STL中的分配器是用于给容器Containers分配内容和释放内存的,即进行容器的内存管理,通常我们使用容器的时候都是使用默认的分配器,当然你也可以自己去定制一个分配器。
2、分配器的一般原理
- 一般容器分配内容都是通过分配器最后调用operator new()方法实现,而operator new()会调用malloc()函数;
- 一般容器释放内存都是通过分配器最后调用operator delete()方法实现,而operator delete()会调用free()函数;
3、STL容器定义
容器使用泛型编程方式实现,模板中的第二个参数就是定义的分配器:
说明:template中第二个参数allocator<_Ty>就是默认的分配器,它是一个模板类。
4、分配器的定义
分配器是通过模板类定义的,不同的版本的STL库所带的分配器定义都不同。下面是VC6所附的标准库解析:
解析:
a、allocator类定义通过函数allocate()和deallocate()来实现内存分配和释放;
b、可以通过如下方式进行创建内存和释放内存:
int * p = allocator<int>().allocate(120,(int *)0);
allocator<int>().deallocate(p,120);
c、使用malloc分配的内存会带有额外的开销,通常是内存头尾的cookie,可以记录大小;
d、因为allocate()方法,第二个参数要指定分配数据的类型,VC的分配器不适合直接使用,但是给容器使用没有问题;
5、容器之间的关系
在STL中,容器是用泛型编程的方式实现,其中序列式容器和关联式容器是用复合的方式实现,如下图所示:
说明:上图通过缩排方式表示容器间关系,如stack和queue容器中含有deque,是通过deque实现;set和map容器含有rb_tree是通过rb_tree实现。