STL配置器(allocator)简介

假如有类Arwen,然后实例化该类

class Arwen { }

Arwen pWen = new Arwen; //这里实际上背后分两步执行.(1)调用operator new 配置内存 (2)调用Arwen::Arwen()构造对象内容

delete pWen;   //这里背后也是两步(1)调用Arwen:~Arwen()将对象析构 (2)调用operator delete释放内存.

这里的operator new 与C中的malloc对应,operator delete 与 C中的free对应.

 

STL中的allocator相当于显式的来实现new运算符与delete运算符.总实现4个步骤.

(1)使用allocate来配置内存 , 使用deallocate来释放内存

(2)使用construct来负责对象构造,使用destroy来析构对象.

 

当然了实际的实现中可没这里讲的这么简单,复杂的多了.

内存分配(allocate)与内存释放(deallocate)

内存分配

template<class T>

T* allocate(size_t size)

{

 T* tmp =  (T*) (operator new ( n*sizeof(T))  );//实际上你也可以用C中的malloc. T* tmp = (T*) malloc(n* sizeof(T) );

return tmp;

}

 

释放内存

template<class T>

void deallocate(T* p) {

operator delete(p);   //如果前面用的malloc则是用free(p);

}

 

构造对象construct 与析构对象destroy

也就是显式的去调用构造函数与析构函数.你可能会疑惑,我平常就使用一个new就完事,构造函数会被自动的调用到.如果显式去调用可咋整啊?这里就需要用到一个新概念叫placement new.关于new的三个相关的但又不同的概念:

(1)new (2)operator new (3) placement new

其中(1)new是我们最常用的,它不能被重载.使用它时总是会先自动调用operator new分配内存,然后调用构造函数初始化对象

(2)operator new就跟C中的malloc一样,只是简单的分配内存.例如 int* ip =(int*) operator new (sizeof(int) );

(3)placement new是operator new的一个重载版本.但它不会分配内存,只是返回已经分配的内存地址,并初始化该内存块中的一些变量值.

所以我们是通过使用placement new来显式的调用构造函数.用法如下:

template<class Ta , class Tb>

void construct(Ta* p , const Tb& value){

new (p) Ta(value);  //这就是所谓的placement new.样子长的有点怪怪的吧.比一般的new多了个(p),这个p就是对象的内存地址了.

}

 

析构函数的话就简单了啊

template<class T>

void destroy (T* p){

p->~T(); //直接调用析构函数就可以了.

}

 

你可能会纳闷为啥析构函数直接调用就可以了啊,而直接调用构造函数会那么麻烦.这我也没搞懂.反正你可写代码试下.就假如用说到的类Arwen.

Arwen* p = new Arwen;

p->Arwen(); //这样直接调用构造函数肯定出错

p->~Arwen(); //这样调用析构函数是没一点问题的.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值