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

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对空间配置器的设计与实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值