空间配置器 // zshalloc.h #ifndef _ZSHALLOC_H #define _ZSHALLOC_H #include <new> #include <cstddef> #include <cstdlib> #include <climits> #include <iostream> namespace ZSH { //重写new template<class T> inline T* _allocate(ptrdiff_t size, T*) { set_new_handler(NULL); T* temp = (T*)(::operator new((size_t)(size * sizeof(T)))); if(!temp) cerr<<"out of memory!"<<endl,exit(1); return temp; }; //对应重写delete template<class T> inline void _deallocate(T* buffer) { ::operator delete(buffer); }; template<class T1,class T2> inline void _constructor(T1* p,const T2& value) { new(p)T1(value);//限定new,替换默认构造函数,详情可以参考exceptional }; template<class T> inline void _destroy(T* ptr) { ptr->~T(); }; template<class T> class allocator { public: typedef T vlaue_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef size_t size_type; typedef ptrdiff_t difference_type; //rebind allocator template<class U> struct rebind { typedef allocator<T> other; }; //构造函数 pointer allocator(size_type n , const void* hint =0) { return _allocate((difference_type)n,(pointer)hint); }; void deallocator(pointer p,size_type n){_deallocate(p);}; void construct(pointer p , const T& value) { _constructor(p,value); }; void destroy(pointer p) { _destroy(p); }; pointer address(reference x) { return (pointer)&x; }; const_pointer const_address(const_reference x) { return (const_pointer)&x; }; size_type max_size()const { return size_type(UINT_MAX / sizeof(T) ); }; }; } #endif//end // zshalloc.h //test int main(void) { int ia[5] = {0,1,2,3,4}; unsigned int i = 0; vector<int,ZSH::allocator<int>> v(ia,ia+5); for( i = 0 ; i < v.size() ; i++) cout<<ia[i]<<" "; cout<<endl; }