Witam, mam problem z biblioteką box2D oraz std::vector. Wydaje mi się że problem raczej nie dotyczy samej biblioteki.
W kodach poniżej próbuje stworzyć "ciało fizyczne" a następnie je usunąć:
Działający kod:
#include <Box2D/Box2D.h>
int main()
{
b2Vec2 gravity(0.0f,10.0f);
b2World world(gravity, true);
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(1.0f, 1.0f);
b2Body* physical = world.CreateBody(&bodyDef);
world.DestroyBody(physical);
}
}
Problem pojawia się, gdy próbuje stworzyć klasę która bedzie odpowiedzialna za ciało:
Nadal działający kod:
class shape
{
public:
shape(b2World&);
~shape();
private:
b2Body* physical;
};
shape::~shape()
{
if(physical != nullptr) {
physical->GetWorld()->DestroyBody(physical);
physical = nullptr;
}
}
shape::shape(b2World& world)
: physical(nullptr)
{
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(1.0f, 1.0f);
physical = world.CreateBody(&bodyDef);
//skipping fixture etc..
}
int main()
{
b2Vec2 gravity(0.0f,10.0f);
b2World world(gravity, true);
shape test(world);
}
Ostateczny problem pojawia się, gdy próbuje trzymać klasę w std::vector:
Crash:
class shape
{
public:
shape(b2World&);
~shape();
private:
b2Body* physical;
};
shape::~shape()
{
if(physical != nullptr) {
physical->GetWorld()->DestroyBody(physical);
physical = nullptr;
}
}
shape::shape(b2World& world)
: physical(nullptr)
{
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(1.0f, 1.0f);
physical = world.CreateBody(&bodyDef);
}
int main()
{
b2Vec2 gravity(0.0f,10.0f);
b2World world(gravity, true);
std::vector<shape> objects;
objects.push_back(shape(world));
// Nie musze nawet zacząć usuwać objektów zeby program się rozwalił
// co jest w sumie naturalne, gdyż koniec main() usuwa wszystko z vectora.
Program kompiluje sie, a następnie po uruchomieniu po prostu następuje crash. W konsoli mogę przeczytać: Assertion failed