自己动手写的allocate,还有待完善

来源:互联网 发布:c语言条件语句 编辑:程序博客网 时间:2021/04/13 10:20
/**Version:1*Date: 10/23*CopyRight:pjGan*/#ifndef DEFINE_DATA#define DEFINE_DATA#include <new>#include <cstddef>#include <cstdlib>#include <climits>#include <iostream>namespace MyAllocateSpace{    template <typename T>    inline T* _allocate(std::ptrdiff_t size, T*){        std::set_new_handler(0);        T *pTmp = (T *)(::operator new(static_cast<std::size_t>(size*sizeof(T))) );        if(NULL == pTmp) {            std::cerr<<"Memory failed"<<std::endl;            exit(1);        }        return pTmp;     }    template <typename T>    inline void _deallocate(T *pBuff) {        if(NULL == pBuff) {            std::cerr<<"Delete the Memory failed"<<std::endl;            exit(1);        }         ::operator delete(pBuff);    }    template <typename Type1, typename Type2>    inline void _construct(Type1 *pType, const Type2 &r_Value) {        new(pType) Type1(r_Value);    }    template <typename T>    inline void _destory(T *ptr) {        ptr->~T();    }    template <typename T>    class Myallocator_ {    public:        typedef T                          value_type;        typedef T*                         pointer;        typedef const T*                 const_pointer;        typedef T&                        reference;        typedef std::size_t             size_type;                    typedef const T&                const_reference;        typedef std::ptrdiff_t          difference_type;        template <typename U>        struct rebind {            typedef Myallocator_<U> other;        };        pointer allocate(size_type n, const void * hint = 0) {            return _allocate(static_cast<difference_type>(n), static_cast<pointer>(0));        }        void deallocate(pointer p, size_type n) {            _deallocate(p);        }        void destory(pointer p, const T &r_value) {            _construct(p, r_value);        }        pointer address(reference x) {            return static_cast<pointer>(&x);        }        const_pointer const_address(const_reference x) {            return static_cast<const_pointer>(&x);        }        size_type max_size() const {            return size_type(UINT_MAX/sizeof(T) );        }    };} //end of MyAllocateSpace#endif //DEFINE_DATA
#include <iostream>#include "DefineData.h"#include <vector>int main(){    int iArrayData[5] = {0, 1, 2, 3, 4};    std::vector<int, MyAllocateSpace::Myallocator_<int> >iv(iArrayData, iArrayData+5); //自己构造的allocate    return 0;}