首页 > 解决方案 > 异常未处理 - 这是 Nullpointer C++

问题描述

我有两个类 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指针是函数调用还是数组屏幕?

标签: c++pointersnullpointerexception

解决方案


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

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

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

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

推荐阅读