自己写的内存池错乱了

jiandingzhe 2012-08-21 08:37:21
自己写了个奇怪的内存池: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;
};


然后,定义了一个FooBar类用来测试,大小为8字节。

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;


然而,问题来了:我的obj1的index是10,也就是应当在mem + 10*8的位置上。但是却得到:

obj1 index 10
obj1 at 0x8fb058

mem block at: 0x8fb010

obj1和mem只差了6*8。这是为什么呢?
...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiandingzhe 2012-08-22
  • 打赏
  • 举报
回复
靠,忘了是16进制了!!!
wqkjj 2012-08-22
  • 打赏
  • 举报
回复
然而,问题来了:我的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粗心了
wqkjj 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

这啥眼神啊..
[/Quote]

+1

温馨提示一下,所谓跳2是在十六进制下的
mLee79 2012-08-21
  • 打赏
  • 举报
回复
这啥眼神啊..
jiandingzhe 2012-08-21
  • 打赏
  • 举报
回复
做了进一步的实验,更诡异了:

uint64_t obj_list_i = pool.allocate(9);
cout<<"obj list index "<<obj_list_i<<endl;

for (int i = 0; i<9; i++) {
uint64_t index = obj_list_i+i;
FooBar& curr = pool[index];
cout<<"list obj index "<<index<<" at "<<&curr<<endl;
}



list obj index 1 at 0x2058010
list obj index 2 at 0x2058018
list obj index 3 at 0x2058020
list obj index 4 at 0x2058028
list obj index 5 at 0x2058030
list obj index 6 at 0x2058038
list obj index 7 at 0x2058040
list obj index 8 at 0x2058048
list obj index 9 at 0x2058050

每次先跳8,再跳2?这太不科学了……

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧