Hello, I've been interested in the D language for a few years
now, but only dabble. I have read TDPL and recently started
reading D Cookbook. On the side, I started to write a small game
in D, but ran into a problem. I would greatly appreciate any help!

My design is a simple state machine. I have a module game.states,
which includes:

interface IState{
    void handleEvents();
    void renderFrame();
}

IState *currentState;
string nextState;

void changeState(){
     if(nextState != "WaitState" && nextState != "ExitState"){
         auto newState = cast(IState)
Object.factory("game.states."~nextState);
         import std.exception;
         enforce(newState);
         currentState = &newState;
         nextState = "WaitState";
     }
}

class TitleState : IState{
     void handleEvents(){
     ...
     }

     void renderFrame(){
         ...
         }
     }
     ...
}

and the game loop is of the following form:

//init state
nextState = "TitleState";
changeState();

//game loop
while(nextState != "ExitState"){
     currentState.handleEvents();
     currentState.renderFrame();
     changeState();
}

However, it appears that the changeState function has a bug.
I believe the problem is that when changeState returns, newState
gets garbage collected, despite currentState pointing to it.
I come from a C++ background, so I am not used to garbage
collection.
Normally the changeState function would explicitly free the old
state, and allocate the new one.

Am I correct that newState is liable to be collected after
changeState returns?
Is there an easy fix?
Is my design fundamentally flawed within the context of garbage
collection?
If so, what kind of design would you recommend instead?

Reply via email to