对象似乎正在删除自己,或者在构造函数之后内存发生了变化

Object seemingly deleting itself or memory changing after constructor

本文关键字:之后 构造函数 内存 变化 发生了 或者 自己 删除 对象      更新时间:2023-10-16

我有一个游戏,针对这个问题精简了它,一个GameHandler类、一个game类和一个Grid类。

GameHandler类在其头文件中有一个Game对象的声明。GameHandler构造函数然后重新构造Game对象,因此

 game = Game();

游戏的头文件中有一个指向Grid对象的指针声明。然后构造函数定义网格对象:

grid = new Grid(x, y, z);

然后我可以继续玩游戏,一直玩到最后(通过死亡或完成)。当我完成游戏时,GameHandler给了我重新开始的选项,为了做到这一点,我想我只需重置游戏状态,然后调用

game = Game();

再次。这并没有抱怨,它似乎确实创建了一个新的游戏对象,而这个对象又创建了一种新的网格。不过,这一次,在构建网格后,使用VS2010并查看本地数据,当网格开始更新或绘制时,网格内所有变量的位置都指向0xfeeef2或类似的数据,这是在程序运行过程中根据一些搜索删除的数据。唯一被删除的地方是在游戏的析构函数中。

所以我现在的假设是,我正在覆盖游戏对象,然后我覆盖的对象决定称其为析构函数,这反过来又会擦除网格,使其为空。老实说,我不知道,所以任何见解都是好的。

您忘记定义复制构造函数和赋值运算符,其中一个Game正在销毁其析构函数中的Grid—由于指针被复制而被其他CCD_ 4使用的CCD_。


猜测:

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);
     }
};