Basically i get a "free(): invalid pointer: 0x00000000006de9b8" error. However it's not because i'm deleting the wrong pointer. The pointer was properly created with "new" and the one created and the one being deleted do match.

The pointer i'm deleting is a pointer type of an abstract base class while it is actually pointing to an object of a derived class.

When I cast the pointer down to the actual derived type it does delete properly. Why? Please elaborate on the issue.

I'm not going to paste the complete code here because of it's size. I have tried to reproduce the error with a simpler example but have failed.

Code:
class Game{
public:
	virtual void start() = 0;
	virtual void pauze() = 0;
	virtual void terminate() = 0;

	virtual void addGameStatusObserver(GameStatusObserver * observer) = 0;
	virtual void removeGameStatusObserver(const GameStatusObserver * observer) = 0;
};
Code:
Game *MyGameFactory::createGame() {

	EngineFactory engineFactory;
	GameEngineFacade enf = engineFactory.createGameEngine();
	AIRacket racket = AIRacket();
	MouseRacket mouseRacket = MouseRacket();
	Game *game = (Game *)(new GameWorldFacade(enf, racket, mouseRacket));
	return (Game *)game;
}
Code:
GameFrameWork::~GameFrameWork() {
	for (unsigned int i = 0; i < games.size(); i++) {
		//GameWorldFacade * game = (GameWorldFacade *)games[i]; // ok
		Game * game = games[i];  // invalid pointer:
		game->terminate();
		delete game; // runtime error on delete
	}
}