首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

自各儿写的内存池错乱了

2012-09-16 
自己写的内存池错乱了自己写了个奇怪的内存池:alloc时,返回整数的index而不是指针;池另有函数负责从index

自己写的内存池错乱了
自己写了个奇怪的内存池: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粗心了

热点排行