Объект, казалось бы, удаляющийся сам или память, изменяющаяся после конструктора - PullRequest
0 голосов
/ 04 января 2012

У меня есть игра, урезанная для задачи, класс GameHandler, класс Game и класс Grid.

Класс GameHandler имеет объявление объекта Game в своем заголовочном файле.Затем конструктор GameHandler реконструирует объект Game, поэтому

 game = Game();

В заголовочном файле игры есть объявление указателя на объект Grid.Затем конструктор определяет этот объект Grid:

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

Затем я могу перейти к игре до конца (смертью или завершением).Когда я заканчиваю игру, GameHandler дает мне возможность начать заново, и для этого я решил просто сбросить игровые состояния и затем снова вызвать

game = Game();

.Это не жалуется, похоже, оно создает новый игровой объект, который, в свою очередь, создает новую сетку.На этот раз, однако, после построения сетки, использования VS2010 и просмотра локальных объектов, к тому времени, когда сетка возвращается к обновлению или рисованию, местоположения всех переменных внутри сетки указывают на 0xfeeefef2 или подобное, что является данными, которыебыл удален во время работы программы в результате нескольких поисков.Единственное место, где это удалено, находится в деструкторе игры.

Итак, на данный момент я предполагаю, что я перезаписываю игровой объект, а затем перезаписанный объект решил назвать его деструктором,в свою очередь стирает сетку, оставляя ее пустой.Я, честно говоря, понятия не имею, так что любое понимание было бы хорошо.

1 Ответ

1 голос
/ 04 января 2012

Вы забыли определить конструктор копирования и оператор присваивания, и один из ваших Game s уничтожает Grid в его деструкторе - Grid, который используется другими Game s, потому что указатель был скопирован.


Гадание:

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);
     }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...