1

Я только недавно начал использовать 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. Это то, что список свободных кусков выглядит перед выделением:

Before allocation

И после того, как b2Body создается:

After allocation

Как вы можете видеть, есть явно испорчена память список фрагментов. Кто-нибудь знает, почему это происходит? Статическая связь моего проекта решит это?

ответ

0

Проблема, с которой я столкнулся, связана с поврежденной памятью, произошедшей между передачей кода из библиотеки DLL в код исполняемого файла. Хотя я не совсем уверен, почему это было, я думаю, что это могло иметь какое-то отношение к DLL Hell. Решение состояло в том, чтобы сделать мою библиотеку игр статической библиотекой вместо динамической. Это просто скомпилировало весь код непосредственно в исполняемый файл и не повредила память, вызванная переходом.

0

Я неправильно установил userData при создании b2BodyDef. Я думаю, что userData вызывает проблемы с памятью, и что-то не так, когда b2Body уничтожается. Проблема была решена после правильной настройки userData.