我有两个类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指针?
答案 0 :(得分:0)
错误是显示指针没有指向任何东西,这是未初始化的指针。指针仅存储内存的地址,而不存储实际的内存。因此,您仅创建了一个指针,但没有创建它指向堆上的内存。这意味着在构造函数中,您应该在堆上创建一个新的显示对象,并将其分配给指针。
Snake::Snake()
{
display = new Display;
}
这将为您提供预期的行为。
同样重要的是要注意,必须删除指针指向的内存,否则它将一直浮动在该内存中,直到程序结束。因此,您的Snake析构函数应该delete
显示:
Snake::~Snake()
{
delete display;
}