STL空间配置器

第二章中提到了内存配置器Allocator,仿造STL的标准接口,写了一个自己的实现

  
  
  
  
  1. template<class T>  
  2. class allocator   
  3. {  
  4. public:  
  5.  
  6.     //类型别名  
  7.     typedef T value_type;  
  8.     typedef T* pointer;  
  9.     typedef T& reference;  
  10.     typedef const T* const_pointer;  
  11.     typedef const T& const_reference;  
  12.     typedef size_t size_type;  
  13.     typedef ptrdiff_t difference_type;  
  14.       
  15. //再次绑定类型名:STL规定allocator<U> == allocator<T>::rebind<U>::other,   
  16.     //所以我们这么定义,可参考http://blog.csdn.net/zcsylj/article/details/6752041  
  17.     template<class U>  
  18.     struct rebind{  
  19.         typedef allocator<U> other;  
  20.     };  
  21.  
  22.     //使用operator new来申请空间:类似于C语言中的malloc,返回的是void*d类型的指针,要进行转换  
  23.     pointer allocate(size_type n, const void * = 0)  
  24.     {  
  25.         pointer tmp = (pointer)operator new(sizeof(value_type) * n);  
  26.         return tmp;  
  27.     }  
  28.  
  29.     //使用operator delete来释放空间,类似于C语言中的free(void*)  
  30.     void deallocate(pointer p, size_type n)  
  31.     {  
  32.         operator delete((void*)p);  
  33.     }  
  34.  
  35.     //使用定位new【使用方法: new (地址带括号) 构造函数】构造对象  
  36.     void construct(pointer p, const T& value)  
  37.     {  
  38.         new (p) T(value);  
  39.     }  
  40.  
  41.     //直接调用对象的析构函数析构对象  
  42.     void destroy(pointer p)  
  43.     {  
  44.         p->~value_type();  
  45.     }  
  46.       
  47.     //返回地址  
  48.     pointer address(reference x) const 
  49.     {  
  50.         return &x;  
  51.     }  
  52.  
  53.     //返回const类型的地址  
  54.     const_pointer const_address(const_reference x) const 
  55.     {  
  56.         return (const_pointer)(&x);  
  57.     }  
  58.       
  59.     //可以申请value_type类型的最大个数  
  60.     size_type max_size() const 
  61.     {  
  62.         return (INT_MAX / sizeof(value_type));  
  63.     }  
  64. };  

部分内容可以参看C++ Primer(4th)中18.1节的内容。主要是new的几种使用:

new 包含 operator new + placement new 两个步骤,前者申请空间,后者构造对象

delete 包含  对象析构函数 + operator delete 两个步骤,前者析构对象,后者回收空间。

本文出自 “It_FAN” 博客,转载请与作者联系!

你可能感兴趣的:(职场,STL,休闲,空间配置器)