自己写的内存池错乱了
自己写了个奇怪的内存池:alloc时,返回整数的index而不是指针;池另有函数负责从index映射到指针;池子有两个红黑树,存有已用和未用的空间位置。但是,从index映射到指针的时候,出现了问题:
首先,池子长这样:
- C/C++ code
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;};然后,定义了一个FooBar类用来测试,大小为8字节。
- C/C++ code
class FooBar {public: FooBar(): foo(0), bar(0) {} FooBar(int foo, int bar): foo(foo), bar(bar) {} int foo; int bar;};然后建立并分配一个空间:
- C/C++ code
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;
然而,问题来了:我的obj1的index是10,也就是应当在mem + 10*8的位置上。但是却得到:
obj1 index 10
obj1 at 0x8fb058
mem block at: 0x8fb010
obj1和mem只差了6*8。这是为什么呢?
[解决办法]
这啥眼神啊..
[解决办法]
[解决办法]
然而,问题来了:我的obj1的index是10,也就是应当在mem + 10*8的位置上。但是却得到:
obj1 index 10
obj1 at 0x8fb058
mem block at: 0x8fb010
obj1和mem只差了6*8。这是为什么呢?
------------------------------------------
(1) index 10对应为mem+8*(10-1) 其offset为72
(2) obj1-mem = 0x48 = 72
不是啥诡异,是LZ粗心了