C++ boost::快速池分配器引发访问冲突异常
好的,我在使用C++ boost::快速池分配器引发访问冲突异常,c++,boost,allocation,pool,allocator,C++,Boost,Allocation,Pool,Allocator,好的,我在使用boost::fast\u pool\u分配器时遇到了一点问题 我的代码用于对fast\u pool\u allocator::allocate(1)的前两个调用, 但随后出现以下消息: Engine.exe中0x000000013fd0fe2d处未处理的异常:0xC00000005: 访问冲突读取位置0x0000000000ffffff 调用堆栈: Engine.exe!boost::simple_segregated_storage<unsigned __int64>
boost::fast\u pool\u分配器时遇到了一点问题
我的代码用于对fast\u pool\u allocator::allocate(1)
的前两个调用,
但随后出现以下消息:
Engine.exe中0x000000013fd0fe2d处未处理的异常:0xC00000005:
访问冲突读取位置0x0000000000ffffff
调用堆栈:
Engine.exe!boost::simple_segregated_storage<unsigned __int64>::malloc() Line 104
Engine.exe!boost::pool<boost::default_user_allocator_new_delete>::malloc() Line 223
Engine.exe!boost::singleton_pool<boost::fast_pool_allocator_tag,128,boost::default_user_allocator_new_delete,boost::details::pool::win32_mutex,32>::malloc() Line 59
Engine.exe!boost::fast_pool_allocator<EventDataSize,boost::default_user_allocator_new_delete,boost::details::pool::win32_mutex,32>::allocate(const unsigned __int64 n) Line 229
Engine.exe!IEventData::operator new(unsigned __int64 size) Line 46
etc...
Engine.exe!boost::简单隔离存储::malloc()行104
Engine.exe!boost::pool::malloc()行223
Engine.exe!boost::singleton_pool::malloc()行59
Engine.exe!boost::fast\u pool\u allocator::allocate(const unsigned\u int64 n)行229
Engine.exe!IEventData::运算符新(无符号_int64大小)第46行
等
所讨论的boost代码行似乎正是分配器存储机制即将返回下一个空闲块并将其从内存中删除的地方
自由块列表
void * malloc()
{
void * const ret = first;
// Increment the "first" pointer to point to the next chunk
first = nextof(first); // <--- This is the line that is failing.
return ret;
}
void*malloc()
{
void*const ret=第一个;
//递增“第一个”指针以指向下一个块
first=nextof(first);//始终测试您的理论(无论它们是什么)是否成立。您似乎有一个理论,即128字节对于任何IEventData都足够好,因此您可以忽略大小?继续测试:
void* operator new(size_t size)
{
if ( size > sizeof( EventDataSize ) )
{
throw std::runtime_error("crappy idea, pal");
}
void* ptr = boost::fast_pool_allocator<EventDataSize>::allocate(1);
if (!ptr)
throw std::bad_alloc();
return ptr;
}
void*运算符新建(大小)
{
如果(大小>sizeof(EventDataSize))
{
抛出std::runtime_错误(“糟糕的想法,朋友”);
}
void*ptr=boost::fast\u pool\u分配器::allocate(1);
如果(!ptr)
抛出std::bad_alloc();
返回ptr;
}
对我来说,可能有大于128字节的事件数据,因此它会把池分配器池中的内容搞砸。始终测试你的理论(无论它们是什么)是否成立。你似乎有一个理论,即128字节对于任何IEventData都足够好,因此你可以忽略大小。继续测试:
void* operator new(size_t size)
{
if ( size > sizeof( EventDataSize ) )
{
throw std::runtime_error("crappy idea, pal");
}
void* ptr = boost::fast_pool_allocator<EventDataSize>::allocate(1);
if (!ptr)
throw std::bad_alloc();
return ptr;
}
void*运算符新建(大小)
{
如果(大小>sizeof(EventDataSize))
{
抛出std::runtime_错误(“糟糕的想法,朋友”);
}
void*ptr=boost::fast\u pool\u分配器::allocate(1);
如果(!ptr)
抛出std::bad_alloc();
返回ptr;
}
对我来说,可能有大于128字节的事件数据,因此它会把池分配器池中的内容搞砸。我意识到,因为我有另一个基类IControl,使用相同的模式,并使用它自己的ControlSize虚拟(也是128字节)两个快速池分配器在引擎盖下使用相同的池对象
然而,我的IControl子类中有一个大于128字节,因此它的分配没有问题,但随后覆盖了可用块的池链接列表
从本质上讲,这正是Oo Tiib所谈论的问题,但它转移到了稍微不同的代码部分
正如Oo Tiib和bish bash bosh所示,我在这两个地方都安装了代码,它工作起来很有魅力!我意识到,因为我有另一个基类IControl,使用相同的模式,并使用它自己的ControlSize虚拟(也是128字节),这两个快速池分配器都在引擎盖下使用相同的池对象
然而,我的IControl子类中有一个大于128字节,因此它的分配没有问题,但随后覆盖了可用块的池链接列表
从本质上讲,这正是Oo Tiib所谈论的问题,但它转移到了稍微不同的代码部分
我在Oo Tiib和bish bash bosh两个地方都安装了代码,效果非常好!感谢Oo Tiib的回复…我将使用你的额外代码,因为这是个好主意。不幸的是,我目前只有一个从IEventData继承的具体类,它的大小只有8字节。据我所知,不是任何IEventData子类出了问题,而是实际的分配器本身。是否有人知道任何资源/教程解释了boost::fast_pool_分配器的所有可能用法,特别是在重载运算符new和继承方面?谢谢!事实上-我意识到了发生了什么,你的回答给了我很大的帮助提示!下面的详细信息!感谢您的回复Oo Tiib…我将使用您的额外代码,因为这是一个好主意。不幸的是,我目前只有一个从IEventData继承的具体类,它的大小只有8字节。据我所知,并不是任何IEventData子类出了问题,而是实际的分配器lf.是否有人知道任何资源/教程解释了boost::fast_pool_分配器的所有可能用法,特别是关于重载运算符new和继承的用法?谢谢!事实上,我意识到了发生了什么,你的回答给了我一个巨大的提示!详情如下!