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

[软件工程师好难]boost库中关于pool的有关问题,请大侠帮助一下,谢谢

2013-08-04 
[程序员好难]boost库中关于pool的问题,请大侠帮助一下,多谢!最近使用了boost pool中的singleton_pool这个

[程序员好难]boost库中关于pool的问题,请大侠帮助一下,多谢!
最近使用了boost pool中的singleton_pool这个类,请问


template <typename T,unsigned NextSize>
singleton_pool<singleton_pool_tag,sizeof(T),default_user_allocator_malloc_free,details::pool::default_mutex,NextSize>

中的类型T是包含有动态结构的类型,这样的使用安全么?

比如类型T为:

class UserBusiness
{
typedef unsigned int UINT_32;
    list<UINT_32> serverIP;
}


问题描述:
我最近在使用这种类型作为pool的基本分配单元时出现了问题,当时我分配的chunk块有点大,上面的NextSize=200000,程序中动态分配的该类型变量的数量最大为30000左右.

后来,我的程序出现了错误,gdb定位的时候,发现是内存分配的时候出错的.提示为调用singleton_pool::malloc()出错.更具体的原因是在下面这个地方,也就是simple_segregated_storage.hpp中的

void * malloc BOOST_PREVENT_MACRO_SUBSTITUTION()
{
    void * const ret = first;
    // Increment the "first" pointer to point to the next chunk
    first = nextof(first);
    return ret;
}

红色标记出出现了 Segmentation fault.


有关疑问: 
疑问1:我想问下上面的UserBusiness类型作为pool分配的单元时,UserBusiness中的list在进行内存扩展时,其所用到的内存也是在pool中分配的吗? 

疑问2: 关于申请的pool内存池,NextSize的大小不够时,会自动申请吗?如果会,那么扩展的大小是什么标准?

疑问4:虽然gdb调试时说是在调用Singleton_malloc()时发生段错误,原因有没有可能是我在其他地方分配的内存破坏掉了boost pool分配的内存池结构?比如说本来boost pool中的某个block中的指针是指向下个block的,但是可能程序其他地方把其内存改写了,导致分配boost pool分配内存的时候,block链表索引时,下个block指向了非法的位置?
注:不管调试多少次,gdb提示段错误的原因总是在这里.

疑问3:程序使用的内存我要将它控制在可控制的范围内,通过boost库的内存池怎么样实现这样的功能,保证在处理大数据量时能防止内存溢出.说个思路就行.


由于本人对boost库不是很了解,所以希望各位能够帮忙指导详细一点,在此感谢!因为这个问题一直没解决,所以工作进度一直卡在这里,作为一个程序员,你懂得,压力山大,球各位大牛指点迷津.
谢谢!!!!! 内存 Boost C++ Singleton_pool
[解决办法]
1. 不是, list 用到的内存分配器需要在模板参数中指定, 它默认使用的 std::allocator 通常就是 new/delete 的包装.
2. 会, 扩展是指数级的, 比如第一次分配了 16 不够了, 下一次就分配 32, 再不够了, 下一次就是 64 了.
3. 限制整个程序使用的内存不清楚, 似乎没什么意义, 限制某一种对象最多只能有多少个是比较好实现的.


4. 很有可能.  对分配出来的内存访问越界是可能会覆盖到管理区的数据的.

热点排行