указатели — Повреждение памяти в программе C ++

Я пытаюсь улучшить свой C ++, написав игру о жизни Конвея.

Объект GameBoard поврежден. Я называю его print() метод непосредственно из конструктора объекта Game, и он работает. Затем я вызываю его косвенно через метод Game_print print_board и получаю сообщение об ошибке проверки целостности.

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

Любая помощь с благодарностью!

#include <iostream>
using namespace std;class Board {
int size;
int grid[100][100];

public:
Board(int board_size) {size = board_size;}

void print() {
cout << "Board::print()" << endl;
if (size < 1) {cout << "print: size must be > 0: size=" << size << "\n";  exit(1);}
}
};

class GameRuleSet { }; // Methods removed

class Game {
private:
Board * game_board;
GameRuleSet * rule_set;

public:
Game (GameRuleSet * p_rule_set, int p_board_size) {

Board * game_board = new Board(p_board_size);

cout << "Second Call - indirect..." << endl;
game_board->print();

cout << "Second Call - direct..." << endl;
this->print_board(); // Error manifests from here
}

void print_board() {game_board->print();}
};int main () {
int num_turns = 10; // This line manifests error.
int board_size = 10;

GameRuleSet rule_set = GameRuleSet();
Game game = Game(&rule_set, board_size);
}

-1

Решение

Вы повторно объявляете «Board * game_board» в своем конструкторе, который скрывает переменную-член с тем же именем. Затем он использует выделенную локальную game_board в конструкторе для печати.

В функции print_board () он использует нераспределенный член и поэтому выдает ошибку.

Изменить распределение с

Board * game_board = new Board(p_board_size);

в

game_board = new Board(p_board_size);

в конструкторе, чтобы исправить это.

3

Другие решения