64,637
社区成员
发帖
与我相关
我的任务
分享
template <T>
class my_allocator:public allocator<T>{
MemPool *local_pool;
public:
my_allocator(MemPool *p):local_pool(p){}
T* allocate(size_type n, const void *v=0){///重载allocator::allocate函数来分配内存
return static_cast<T *>local_pool->alloc(n);
}
///...///后面还要重载一些其他函数,如deallocator等
};
MemPool *p1,*p2;
p1=CreatePool(...);
p2=CreatePool(...);
my_allocator<T> alloc_1(p1);///申明一个allocator使用内存池p1
my_allocator<T> alloc_2(p2);///申明一个allocator使用内存池p2
vector<T, my_allocator<T> > vct(alloc_1);///这个vector将使用内存池p1来动态管理内存
deque<T, my_allocator<T> > dq(alloc_2);///这个deque将使用内存池p2来动态管理内存。
///...
MemPool *p1,*p2;
p1=CreatePool(...);
p2=CreatePool(...);
my_allocator<T> alloc_1(p1);///申明一个allocator使用内存池p1
my_allocator<T> alloc_2(p2);///申明一个allocator使用内存池p2
typedef vector<T, my_allocator<T> > My_Vector;
typedef deque<T, my_allocator<T> > My_Deque;
My_Vector *vct = new(p1->alloc(sizeof(My_Vector))) My_Vector(alloc_1);///这个vector将使用内存池p1来动态管理内存
My_Deque *dq = new(p2->alloc(sizeof(My_Deque))) My_Deque(alloc_2);///这个deque将使用内存池p2来动态管理内存。
vct->push_back(T(...));///使用p1中的内存
dq->push_back(T(...));///使用p2中内存
///....
DeletePool(p1);///删除所有p1分配的内存,所以vector的析构函数可以不调用了,是不是这里同C++通常编程模式又有点不相符了:)
DeletePool(p2);///删除所有p2分配的内存,所以deque的析构函数可以不调用了
template <T>
class my_allocator:public allocator<T>{
MemPool *local_pool;
public:
my_allocator(MemPool *p):local_pool(p){}
T* allocate(size_type n, const void *v=0){///重载allocator::allocate函数来分配内存
return static_cast<T *>local_pool->alloc(n);
}
...///后面还要重载一些其他函数,如deallocator等
};
MemPool *p1,*p2;
p1=CreatePool(...);
p2=CreatePool(...);
my_allocator<T> alloc_1(p1);///申明一个allocator使用内存池p1
my_allocator<T> alloc_2(p2);///申明一个allocator使用内存池p2
vector<T, my_allocator<T> > vct(alloc_1);///这个vector将使用内存池p1来动态管理内存
deque<T, my_allocator<T> > dq(alloc_2);///这个deque将使用内存池p2来动态管理内存。
...
MemPool *p1,*p2;
p1=CreatePool(...);
p2=CreatePool(...);
my_allocator<T> alloc_1(p1);///申明一个allocator使用内存池p1
my_allocator<T> alloc_2(p2);///申明一个allocator使用内存池p2
typedef vector<T, my_allocator<T> > My_Vector;
typedef deque<T, my_allocator<T> > My_Deque;
My_Vector *vct = new(p1->alloc(sizeof(My_Vector))) My_Vector(alloc_1);///这个vector将使用内存池p1来动态管理内存
My_Deque *dq = new(p2->alloc(sizeof(My_Deque))) My_Deque(alloc_2);///这个deque将使用内存池p2来动态管理内存。
vct->push_back(T(...));///使用p1中的内存
dq->push_back(T(...));///使用p2中内存
....
DeletePool(p1);///删除所有p1分配的内存,所以vector的析构函数可以不调用了,是不是这里同C++通常编程模式又有点不相符了:)
DeletePool(p2);///删除所有p2分配的内存,所以deque的析构函数可以不调用了
///....
vct->~My_Vector();
dq->~My_Deque();
///析构函数调用my_allocator<T>::deallocator将(T或T数组的)内存返还给内存池,同时也析构自身数据成员。
///这样做的原因是:
///1、容器类可能存在动态分配的数据成员(不是T或T数组,不采用my_allocator<T>::allocator分配);
///2、容器类的基类(如果有的话)或某些数据成员内部可能动态分配了(不来自内存池的)内存,那么不析构它们也会导致内存泄漏。
DeletePool(p1);
DeletePool(p2);
vector<T, my_allocator<T> > v1(my_allocator<T>(1)); // 使用内存池#1
vector<T, my_allocator<T> > v2(my_allocator<T>(2)); // 使用内存池#2
vector<T, my_allocator<T> > v3(v2); // 仍使用内存池#2
// my_allocator未必需要是模版类,可根据需要自行决定
my_allocator<T> alloc_1(1); // 使用内存池#1;未必需要构造函数,也可以用set函数设定
my_allocator<T> alloc_2(2); // 使用内存池#2
....
vector<T, my_allocator<T> > vct(alloc_1);
deque<T, my_allocator<T> > dq(alloc_2);
list<T, my_allocator<T> > lst(alloc_1);
// 需要注意的是,每个容器对象内使用各自的Allocator对象,而非共享构造函数输入的对象
// 实现上,STL容器一般是调用Allocator类的拷贝构造函数;因此,必要时请定义my_allocator<T>的拷贝构造函数
以下均摘自“ISO/IEC 14882:2003”C++ Standard
// i) [lib.list.modifiers]
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
....
Effects: Invalidates only the iterators and references to the erased elements.
// 这回答了第一个问题。
// ii) 目前标准中不包含hash表,原因如9楼所说。
// iii)[lib.vector]
template <class T, class Allocator = allocator<T> >
class vector {
public:
...
explicit vector(const Allocator& = Allocator());
explicit vector(size_type n, const T& value = T(),const Allocator& = Allocator());
template <class InputIterator>
vector(InputIterator first, InputIterator last,const Allocator& = Allocator());
vector(const vector<T,Allocator>& x);
// 此外 [lib.deque]、[lib.list]、[lib.map]、[lib.multimap]、[lib.set]、[lib.multiset]中均有类似声明
// 即所有STL基本容器均可在构造时设置其使用的Allocator对象,因此可以定义带参数的Allocator构造函数区分不同内存池
// iv) 目前标准中不包含template struct less<const char*,const char*> 特化版本,估计是某些实现自行加入。