Исключение Unhanded - это был Nullpointer C ++ - PullRequest
0 голосов
/ 29 мая 2019

У меня есть два класса Display и Snake.С классом Display у меня есть некоторые функции, которые включают создание буфера и т. Д. Я пытаюсь сделать что-то, что кажется мне логичным, но, по-видимому, не компилятору

cSnake.h

class Snake 
{
public:
    Snake();
    void printSnake();
    ~Snake();

private:
    Display* display;

};

cSnake.cpp

Snake::Snake()  {}

void Snake::printSnake() {
    display->PrintCharecter(40, 15, L"    Hello World   ");
}

Snake::~Snake() {}

Это класс Display

Class Display{
public:
void CreateScreenBuffer();
void DisplayFrame();
void PrintCharecter(int x, int y LPCWSTR text);
private:
int nScreenWidth;
int nScreenHeight;
wchar_t *screen;
}
// The function that I try to call
void Display::PrintCharecter(int x, int y, LPCWSTR text) {
    wsprintf(&screen[y* nScreenWidth + x], text); // exception is thrown here
}

Вызов его в главном

Snake snake
snake.printSnake();

Затем он генерирует бесполезное исключение, которое,Будучи нулевым указателем.Я немного смущен, какой указатель NULL это вызов функции или экран массива?

1 Ответ

0 голосов
/ 29 мая 2019

Ошибка в том, что указатель Display указывает на ничто, что является неинициализированным указателем. Указатель хранит только адрес памяти, а не фактическую память. Поэтому вы создали только указатель, но не память, на которую он указывает в куче. Это означает, что в вашем конструкторе вы должны создать новый экранный объект в куче и назначить его указателю.

Snake::Snake()
{
    display = new Display;
}

Это даст вам ожидаемое поведение. Также важно отметить, что вы должны удалить память, на которую указывает указатель, иначе она будет просто перемещаться туда до завершения программы. Поэтому ваш деструктор Змея должен delete отображать:

Snake::~Snake()
{
    delete display;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...