c++ - 异常未处理 - 这是 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指针是函数调用还是数组屏幕?
解决方案
错误是Display指针指向空,这是一个未初始化的指针。指针只存储内存的地址,而不是实际的内存。因此,您只创建了一个指针,但没有创建它指向堆上的内存。这意味着在您的构造函数中,您应该在堆上创建一个新的显示对象并将其分配给您的指针。
Snake::Snake()
{
display = new Display;
}
这将为您提供预期的行为。同样重要的是要注意,您必须删除指针指向的内存,否则它只会漂浮在那里直到程序结束。因此,您的 Snake 析构函数应delete
显示:
Snake::~Snake()
{
delete display;
}
推荐阅读
- c# - 构建查询字符串
- redux - 为什么这种状态会被 immer 产品改变?
- c# - 如何使用 C# 在 WebTable 上的每一列中获取三个不同行值的总和
- linux - 将 while 循环记录传递给函数
- android-auto - Android Auto 自定义通知声音
- ios - Swift Firebase:发送电子邮件后如何检查用户是否已验证?
- git - 带有 Git 存储库的 Azure DevOps 数据库备份
- python - 在python中使用正则表达式和for循环值替换字符串
- slack - 如何在松弛中关闭模态?
- javascript - Node.js 中的 php openssl_seal 等效项