STL空间配置器
在C++中,我们习惯的内存配置操作和释放操作是这样的:
class Foo { ... };
Foo* pf = new Foo; //配置内存,然后构造函数
delete pf; //将对象析构,然后释放内存
我们一步可以干的事,其实在new
和delete
算式中都包含两个阶段的操作:
对于new:
1.配置内存 ::operator new()
2.构造对象 Foo::Foo()
对于delete:
1.析构对象 Foo::~Foo()
2.释放内存 ::operator delete()
而STL allocator将这两个阶段操作分开实现。内存分配使用alloc::allocate()
负责,内存释放则是alloc::deallocate()
负责;对象构造使用::construct()
负责,对象析构则使用::destory()
负责。
内存空间的配置/释放与对象内容的构造/析构,分别落在<stl_alloc.h>
和<stl_construct.h>
文件中。
构造和析构基本工具:construct()和destory()
- construct()
template<class T1,class T2>
void construct(T1* p,const T2& value){
new(p) T1(value);
}
由于将内存操作和对象操作分开,所以只需要将对象的构造设定在指定的空间,C++中placement new可以实现该操作。 - destory()
1.destory() version 1
template<typename _Tp>
inline void
_Destroy(_Tp* __pointer)
{ __pointer->~_Tp(); }
//该版本只需直接调用该对象的析构函数即可。
2.destory() version 2
//该版本接受first和last两个迭代器,准备将[first,last)范围内的所有对象析构掉。在源代码中我们看到__type_traits<T>和value_type(),所以当我们详尽阅读了value_type()和__type_traits<>如何实现之后,我们再回头看看destory() version 2的实现。
我们了解了对象在已经开辟的空间上的构造和析构,那我们接下来就要研究SGI对空间配置器的设计与实现。