自定义的allocator

《STL源码剖析》学习笔记

jjalloc.h

#ifndef  JJALLOC_H
#define JJALLOC_H
#include<new>
#include <cstddef>
#include<cstdlib>
#include<climits>
#include <iostream>
namespace JJ
{
template<class T>
inline T* _allocate(ptrdiff_t size,T*){
    /*set_new_handler则是一个输入并返回
    new_handler类型的函数。set_new_handler的
    输入参数是operator new分配内存失败时要调
    用的出错处理函数的指针,返回值
    是set_new_handler没调用之前就
    已经在起作用的旧的出错处理函数的指针*/
    set_new_handler(0);
    T* tem=(T*)(::operator new((size_t)(size *sizeof(T))));
    if(tem==0){
        cout<<"out of memory"<<endl;
        exit(1);
    }
    return tem;
}
template<class T>
inline void _deallocate(T* buffer){
    ::operator delete(buffer);
} 
template<class T1,class T2>
inline void _construct(T1* p,const T2& value){
   new(p) T1(value);
}
template<class T>
inline void _destroy(T* ptr){
    ptr->~T();
}
template<class T>
class allocator{
public:
    typedef T value_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 alloctor of type u
    template<class U>
        struct rebind{
        typedef allocator<U> other;
    };
    pointer allocate(size_type n,const void* hint=0){
        return _allocate((difference_type)n,(pointer)0);
    }
    void deallocate(pointer p,size_type n){
        _deallocate(p);
    }
    void construct(pointer p,const T& value){
        _construct(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 //JJALLOC_H

测试代码:

#include "jjalloc.h"
#include<iostream>
using namespace std;
class Test
{
  public:
      int x;
      Test(int b=0){
          x=b;
          
      }
      ~Test(){

      }
};
int main()
{
    int x=4;
    JJ::allocator<int> a;
    JJ::allocator<Test> b;
    int *p=a.allocate(1);
    Test *t=new Test;
    //new(p) T1(value) 这叫place new,在指针p所指向的内存空间创建一个
    //类型为T1的对象。调用的构造函数接受一个类型为const 
//    T2&(或其他兼容类型)的参数
//    new(&t) Test(x);
    b.construct(t,x);
    *p=1;
    cout<<*p<<endl;
    cout<<t->x<<endl;
    cout <<*(a.address(x))<<endl;
    cout <<a.max_size()<<endl;
    b.destroy(t);
    a.deallocate(p,1);
    return 0;
}

 

转载于:https://www.cnblogs.com/sklww/p/3521620.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vector allocatorC++ STL库中vector容器的一个模板参数,用于指定容器的内存分配器。默认情况下,vector使用std::allocator作为其内存分配器,该分配器使用new和delete来分配和释放内存。 使用自定义allocator可以实现对内存分配和释放的控制,以满足特定的需求。自定义allocator必须满足allocator的要求,包括定义了一些成员函数,如allocate、deallocate、construct和destroy等。 下面是一个使用自定义allocator的示例: ```cpp #include <iostream> #include <vector> // 自定义allocator template <typename T> class MyAllocator { public: using value_type = T; T* allocate(std::size_t n) { std::cout << "Allocating memory for " << n << " elements" << std::endl; return new T[n]; } void deallocate(T* p, std::size_t n) { std::cout << "Deallocating memory for " << n << " elements" << std::endl; delete[] p; } template <typename... Args> void construct(T* p, Args&&... args) { new (p) T(std::forward<Args>(args)...); } void destroy(T* p) { p->~T(); } }; int main() { // 使用自定义allocator std::vector<int, MyAllocator<int>> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); for (const auto& num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` 运行上述代码,输出结果为: ``` Allocating memory for 1 elements Allocating memory for 2 elements Allocating memory for 3 elements 1 2 3 Deallocating memory for 3 elements Deallocating memory for 2 elements Deallocating memory for 1 elements ``` 该示例中,我们定义了一个名为MyAllocator自定义allocator,并将其作为vector的第二个模板参数。在自定义allocator中,我们重载了allocate、deallocate、construct和destroy等函数,以实现自定义的内存分配和释放逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值