引言
说到C++动态内存分配,我们首先都会想到new和delete运算符,new运算符可以分配并初始化一个对象或对象数组,并返回指向数组第一个对象的指针。而delete运算符则逐个销毁(根据对象数组倒序执行析构函数)对象并回收内存,需要注意的是delete回收对象数组时应加上[]。new和delete是常用的动态内存分配手段,new将分配内存和构造对象结合,delete则将析构和回收内存结合,非常方便的同时也带来了一定的局限性。如果我们只是想分配一块内存,但是并不想马上构造对象时,new运算符的方便就显得有些多余了,这时我们需要把内存的分配与构造两个动作分离,更有效率的进行内存管理,这就需要用到allocator了。
简单的allocator实现
这里我找来了VC++2013中vector容器的原型,我们可以看到实际上vector不单单只有一个模板参数,还有一个默认的参数就是allocator类,我们完全可以DIY一个allocator来分配内存,只要这个allcator满足STL标准的接口要求。
vector<typename _Ty,typename _Alloc = allocator<_Ty>>
让我们来试试自己实现一个简单的allocator类(参考STL源码剖析)
#ifndef __JJALLOC__
#define __JJALLOC__
#include<new> // for placement new
#include<iostream> //for cerr
#include<cstddef> //for ptrdiff_t
#include<cstdlib> // for exit()
#include<climits> // for UINT_MAX
namespace JJ{
template<class T>
inline T* _allocate(ptrdiff_t size, T*){
//set_new_handler(0);
T* tmp = (T*)(::