I want to make simple AI using FSM. When I simply make object it works perfectly fine but when I put them in vector it crashes after second update. Here is smallest code that shows this problem
class State
{
public:
virtual ~State() = default;
void setContext(Context* context);
virtual void processState() = 0;
protected:
Context* m_Context;
};
void State::setContext(Context* context)
{
m_Context = context;
}
class State1 : public State
{
public:
virtual void processState() override;
};
void State1::processState()
{
std::cout << "Processing State1" << std::endl;
m_Context->setState(new State2);
}
class State2 : public State
{
public:
virtual void processState() override;
};
void State2::processState()
{
std::cout << "Processing State2" << std::endl;
m_Context->setState(new State1);
}
class Context
{
public:
Context(State* state);
void update();
void setState(State* state);
private:
State* m_State;
};
Context::Context(State* state)
{
setState(state);
}
void Context::update()
{
m_State->processState();
}
void Context::setState(State* state)
{
delete m_State;
m_State = state;
m_State->setContext(this);
}
If I make it like this
Context context(new State1);
context.update();
context.update();
context.update();
context.update();
context.update();
it works and prints
Processing State1
Processing State2
Processing State1
Processing State2
Processing State1
but if I make it like this
std::vector<Context> contexts;
size_t amount = 1;
contexts.reserve(amount);
for (size_t i = 0; i < amount; i++)
{
Context context(new State1);
contexts.push_back(context);
}
for (size_t i = 0; i < amount; i++)
{
for (size_t j = 0; j < 5; j++)
{
contexts[i].update();
}
}
it only prints first state, crashes on second and gives this error code
Processing State1
-1073741819.
I tried to use break points but i still don't understand what's going on