c++ - boost::fast_pool_allocator 抛出访问冲突异常

标签 c++ boost allocation pool allocator

好的,我在使用 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/

相关文章:

C++ Libcurl 无法清除 header

c++ - boost 函数绑定(bind)编译时出现转换错误

c++ - RPN 计算器 C++ 错误处理和多个运算符

c++ - 使用快速排序算法的类型问题

c++ - 如何查看 cmake_automoc 正在运行的确切命令?

c++ - boost::xtime 没有名为 'is_pos_infinity' 的成员

c++ - 如果我在指向 vector std::vector<Object*>* 的指针上调用 "delete",元素也会被删除吗?

c++ - 理解 C++ 中双指针和单指针内存分配之间差异的问题

c++ - 我应该将分配器作为函数参数传递吗? (我对分配器的误解)

c++ - 为什么在存在 typedef 时出现未解析的外部符号错误?