自己写的内存池错乱了
自己写了个奇怪的内存池:alloc时,返回整数的index而不是指针;池另有函数负责从index映射到指针;池子有两个红黑树,存有已用和未用的空间位置。但是,从index映射到指针的时候,出现了问题:
首先,池子长这样:
template<typename T>class MPool{public: MPool(uint64_t init_size) : size(init_size) { mem = (T*) malloc(size*sizeof(T)); empty_nodes.insert(MPoolNode(0,size)); } inline T& operator [] (uint64_t i) { if (i==0) abort(); return mem[i-1]; } // 这个指针存储一段连续的空间。 T* mem; // 空间的尺寸(注意不是byte数,是对象数) uint64_t size; // 指向空余空间和已用空间的红黑树。 MPoolNodeSet empty_nodes; MPoolNodeSet alloc_nodes;};class FooBar {public: FooBar(): foo(0), bar(0) {} FooBar(int foo, int bar): foo(foo), bar(bar) {} int foo; int bar;};FooBarPool pool(10); // allocate的时候分配n个对象的空间,返回它的index(基于1的) uint64_t obj1_i = pool.allocate(1); cout<<"obj1 index "<<obj1_i<<endl; // 查看一下obj1的地址 FooBar& obj1 = pool[obj1_i]; cout<<"obj1 at "<<&obj1<<endl;