对象似乎正在删除自己,或者在构造函数之后内存发生了变化
Object seemingly deleting itself or memory changing after constructor
我有一个游戏,针对这个问题精简了它,一个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);
}
};
相关文章:
- 在成员构造函数之后调用基类构造函数
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- 使用构造函数初始化结构还是在之后设置其值更好?
- 为什么我的类工作正常,即使在返回垃圾值作为赋值运算符和空复制构造函数的返回之后
- 如何在构造函数之后设置引用?
- 构造函数参数列表之后的结肠符号
- 是什么导致了构造函数之后的这些"意外令牌"错误?
- 类成员在构造函数(线程)之后更改地址
- 成员对象的地址在构造函数之后立即更改
- 为什么在调用隐式类型转换构造函数之后直接是驱动器
- 当第一个 itr 在最后一个 itr 之后时,std::vector 范围构造函数的官方行为是什么?
- 在计算后,在基类之后调用参数化构造函数
- 是在默认构造函数之前或之后调用的初始化列表
- 在简单继承之后调用复制构造函数
- 为什么在静态强制转换之后调用构造函数
- C++类析构函数直接在构造函数之后调用
- 复制构造函数之后的flann::Index的析构函数产生访问冲突
- 在C++中,构造函数是在对象创建之前或之后调用的
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- 这是更有效的Qt:构造函数与参数或默认构造函数与setter之后