Я только недавно начал использовать Box2D с C++ и Visual Studio 2015 и испытываю очень странную ошибку, в которой я получаю нарушение доступа, вызванное b2BlockAllocator.cpp в строке 155. Кажется, что массив присваивается какой-то структуре списка связанных ссылок b2Block, следующее значение которой равно null. Это то, что вызывает нарушение доступа.Ошибка Box2D в b2BlockAllocator.cpp
if (m_freeLists[index])
{
b2Block* block = m_freeLists[index];
m_freeLists[index] = block->next; // <- error occurs here.
return block;
}
else
{...
Но вот что странно. Я разрабатываю библиотеку игр для личного использования, и следующий код используется для создания экземпляра b2Body в классе PhysicsObject в библиотеке игры:
void PhysicsObject::onCreate()
{
/**/
b2BodyDef bodyDef;
bodyDef.type = m_bodyType;
bodyDef.position.Set((float)(m_x + m_width/2)/(float)m_pLevel->getTileSize(), (float)(m_y + m_height/2)/(float)m_pLevel->getTileSize());
m_pBody = m_pLevel->getWorld().CreateBody(&bodyDef);
b2PolygonShape shape;
shape.SetAsBox((float)m_width/(float)m_pLevel->getTileSize() * 0.5f, (float)m_height/(float)m_pLevel->getTileSize() * 0.5f);
b2FixtureDef fixtureDef;
fixtureDef.shape = &shape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
m_pBody->CreateFixture(&fixtureDef); // <- This call is the last executed before the error.
/**/
}
Это в библиотеке игр, которая является Visual Studio DLL проект, и он отлично работает. Однако, когда я переношу этот код EXACT в класс, который происходит из PhysicalObject в тестовом проекте, который ссылается на библиотеку игр, происходит сбой. Выделение каждого объекта в кучу также не имеет значения, поскольку документация Box2D гласит, что объекты, которые они передают, не сохраняют ссылки. Если это помогает, Box2D - это статически связанная библиотека. И тестовый проект, и игровая библиотека имеют одинаковые зависимости и находятся в одной конфигурации. Кто-нибудь есть идея, почему это может произойти? Любая помощь очень ценится.
Update:
Я обнаружил, что причиной аварии, но я не уверен, как именно идти о фиксации его. Проблема в том, что блок-распределитель Box2D как-то становится поврежденным после создания мира b2Body. Это то, что список свободных кусков выглядит перед выделением:
И после того, как b2Body создается:
Как вы можете видеть, есть явно испорчена память список фрагментов. Кто-нибудь знает, почему это происходит? Статическая связь моего проекта решит это?