好的,我在使用 boost::fast_pool_allocator
时遇到了一些问题。
我的代码适用于对 fast_pool_allocator::allocate(1)
的前几次调用,
但随后失败并显示以下消息:
Unhandled exception at 0x000000013fd0fe2d in Engine.exe: 0xC00000005: Access violation reading location 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...
有问题的 boost 代码行似乎就在分配器存储机制即将返回下一个空闲 block 并将其从 空闲 block 列表
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;
}
我的代码是这样的:
class EventDataSize
{
private:
U8 dummyField[128];
};
class IEventData
{
public:
void* operator new(size_t size)
{
void* ptr = boost::fast_pool_allocator<EventDataSize>::allocate(1);
if (!ptr)
throw std::bad_alloc();
return ptr;
}
void operator delete(void* ptr)
{
boost::fast_pool_allocator<EventDataSize>::deallocate((EventDataSize*)ptr, 1);
}
// etc...
}
如您所见,我正在尝试将此 EventDataSize
类用作虚拟对象,以便任何继承自 IEventData
的类都将分配相同的大小(128字节),允许池分配器与继承一起愉快地工作。
我在其他地方使用完全相同的模式来实现其他基类的 operator new,他们似乎没有遇到同样的问题。
奇怪的是,如果我改变 EventDataSize::dummyField
的数组大小,问题就会消失(或者至少,它还没有出现),但我对这样一个不合标准的解决方案感到不舒服...我想知道为什么这个分配器正在做它正在做的事情,我做错了什么,以及我如何优雅地修复它!
最佳答案
我意识到,因为我有另一个基类 IControl,使用相同的模式,并使用它自己的 ControlSize 虚拟对象(也是 128 字节),所以两个 fast_pool_allocators 在幕后使用相同的池对象。
但是,我的 IControl 子类之一大于 128 字节。因此它被分配没有问题,但随后覆盖了空闲 block 的池链接列表。
本质上,这正是 Oo Tiib 正在谈论的问题,只是转移到了一个稍微不同的代码部分。
我在 Oo Tiib 和 bish-bash-bosh 展示的两个地方都修复了代码,它就像一个魅力!
关于c++ - boost::fast_pool_allocator 抛出访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333025/