未处理的异常-这是Nullpointer C ++

时间:2019-05-28 22:32:11

标签: c++ pointers nullpointerexception

我有两个类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() {}

这是展示广告类

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指针。我有点困惑,函数调用或数组屏幕是哪个NULL指针?

1 个答案:

答案 0 :(得分:0)

错误是显示指针没有指向任何东西,这是未初始化的指针。指针仅存储内存的地址,而不存储实际的内存。因此,您仅创建了一个指针,但没有创建它指向堆上的内存。这意味着在构造函数中,您应该在堆上创建一个新的显示对象,并将其分配给指针。

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

这将为您提供预期的行为。 同样重要的是要注意,必须删除指针指向的内存,否则它将一直浮动在该内存中,直到程序结束。因此,您的Snake析构函数应该delete显示:

Snake::~Snake()
{
    delete display;
}