欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL源码剖析--空间配置器的设计与对象的构造和析构设计

程序员文章站 2022-03-23 13:13:34
...

STL空间配置器

在C++中,我们习惯的内存配置操作和释放操作是这样的:

class Foo { ... };
Foo* pf = new Foo;      //配置内存,然后构造函数
delete pf;              //将对象析构,然后释放内存

我们一步可以干的事,其实在newdelete算式中都包含两个阶段的操作:

对于new1.配置内存 ::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对空间配置器的设计与实现。