一、STL空间配置器allcator的主要接口
allocate
deallocate
construct
destroy
嵌套结构体:rebind
这里稍微解释一下rebind的作用,常见用法如下,allocator<int>::rebind<char>::other;
rebind主要是为了实现不同类型采用同样的内存分派的策略。
例如:先看vector的分配器是allocator<T>,你要多少T就给你他就给你多少个T的对象。和new出来的一样。
再看看list的分配器,同样也是allocator<T>,但是了解 链表 这个数据结构的都知道一个node应该是
template<T>
struct node
{
T data;
node* prev;
node* next;
};
所以allocator<T>就无法分配出一个node对象,而仅仅是T对象,象vector的那样。
尽管list的allocator<T>和vector的allocator<T>是一样,但是list还是有其他的办法,它在内部由allocator<T>来获取适合它自己的分配器。
allocator<T>::rebind<node<T> >::other,这个other就是allocator<node<T> >
list就用这个other来分配内存了。
这时候对list和vector都只需要传递allocator<T>的内存分配器就行。当然对list你也可以直接传递,allocator<node<T> >作为内存分配器。
二、样例代码
1: pointer allocate(size_type cnt, CHxAllocator<void>::const_pointer pHint = 0) 2: { 3: UNREFERENCED_PARAMETER(pHint); 4: 5: if (cnt <= 0) 6: { 7: return 0 ; 8: } 9: 10: void* pMem = nullptr ; 11: if (max_size() < cnt || (pMem = malloc(cnt * sizeof(value_type))) == NULL) 12: { 13: throw std::bad_alloc(0); 14: } 15: 16: return static_cast <pointer>(pMem); 17: } 18: 19: void deallocate(pointer p, size_type) 20: { 21: free(p); 22: } 23: 24: void construct(pointer p, const_reference val) 25: { 26: :: new ((void *)p) T(val); 27: } 28: 29: void destroy(pointer p) 30: { 31: p->~T(); 32: }