2016-03-12 2 views
0

На данный момент я делаю свою собственную игру на C++, и для этого я использую физику Box2D. Если я пытаюсь выйти из моей игры он выдает ошибку мне:C++ и Box2D физика: сбой при выходе

ошибка Exception при 0x003A2AE4 в NinjaPlatformer.exe: 0xC0000005: нарушение доступа при чтении в положении 0xFEEEFEF2

В строке b2Contact* c = ce->contact;

Вот код обертывания:

for (b2ContactEdge* ce = body->GetContactList(); ce != nullptr; ce = ce->next) { 
    b2Contact* c = ce->contact; 
    if (c->IsTouching()) { 
     // something 
    } 
} 

Мое предположение, что если я пытаюсь закрыть приложение объемно-контакты удаляются первыми, а затем программа пеет еще один раз в цикл for, а затем строка ce = body->GetContactList() вернет ошибку, потому что тело не определено, это правильно?

И если это правда, то как я могу проверить в для цикла, если с не является пустым, потому что, когда игра вылетает с имеет значение: 0xFEEEFEEE {других = ??? контакт = ??? пред = ??? ...}.

И в результате, что се имеет это странное значение с также имеет странное значение одна строка позже: 0x07932d78 {m_type = b2_dynamicBody | -17891604 (-17891602) m_flags = 65262 m_islandIndex = -17891602 ...}

ответ

1

Вы должны быть забота о краевых условиях: последний действующий b2ContactEdge * с в списке не имеет инициализированный "следующий" члена.

«next» имеет недопустимое значение 0xFEEEFEF2 в последнем ce в вашем списке.

Я предлагаю вам добавить этот конструктор в свой класс b2ContactEdge:

b2ContactEdge() { next = NULL; } 
+0

И тогда в моем коде, я могу, как, если его равен NULL? – Gykonik

+0

Ничего себе, это сработало. b2ContactEdge не имеет конструктора, потому что это только структура, но я добавил его в структуру, и теперь он работает отлично. Большое спасибо! :) – Gykonik

Смежные вопросы