我有一个游戏,为了问题而被剥离,GameHandler类,Game类和Grid类。
GameHandler类在其头文件中声明了一个Game对象。然后GameHandler构造函数重新构造Game对象,所以
game = Game();
游戏中有一个指向其头文件中Grid对象的指针。然后构造函数定义Grid对象:
grid = new Grid(x, y, z);
然后我可以继续玩游戏直到最后(死亡或完成)。当我完成游戏时,GameHandler让我可以选择重新开始,为此我想我会简单地重置游戏状态然后调用
game = Game();
一次。这并没有抱怨,它似乎确实创建了一个新的游戏对象,反过来又创建了一个新的网格。这一次,在构建网格之后,使用VS2010并查看本地,当网格到达更新或绘图时,网格内所有变量的位置都指向0xfeeefef2或类似,这是数据根据一些搜索,在程序运行期间删除了。删除它的唯一地方是游戏的析构函数。
所以我现在的假设是我正在覆盖游戏对象,然后我覆盖的对象决定调用它的析构函数,反过来消除网格,将其留空。老实说我没有任何线索,所以任何见解都会很好。
答案 0 :(得分:1)
您忘了定义复制构造函数和赋值运算符,并且您的Game
之一正在销毁其析构函数中的Grid
- Grid
被其他Game
使用因为指针被复制了。
猜测:
class Game {
Grid* grid;
public:
Game(int x, int y, int z) : grid(0) {
grid = new Grid(x, y, z);
};
~Game() {
delete grid;
}
/* You forgot these: */
Game(Game const& src) : grid(0) {
grid = new Grid(*(src.grid));
}
Game& operator=(Game other) {
swap(other);
return *this;
}
void swap(Game& other) {
// swap all the members (and base subobject, if applicable) with other
std::swap(grid, other.grid);
}
};