好的,我在使用boost::fast_pool_allocator
.
我拥有的代码适用于对 的前几次调用fast_pool_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...
有问题的 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;
}
我的代码如下所示:
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
问题就消失了(或者至少它还没有出现),但我对这种不合标准的解决方案感到不舒服......我想知道为什么这个分配器正在做它正在做什么,我做错了什么,以及如何优雅地修复它!