わかりました、の使用に少し問題があり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...
問題のブースト コードの行は、アロケーター ストレージ メカニズムが次のフリー チャンクを返そうとしているところにあるようで、フリー チャンクのリストからそれを削除しています。
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
問題は解消されます (または少なくとも、まだ発生していません) が、このような標準以下のソリューションには満足できません...なぜこのアロケーターが何をしているのか知りたいです。やっていること、間違っていること、そしてそれをうまく修正する方法を教えてください。