为什么调试器会抛出“读取访问冲突。这是nullptr”例外吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么调试器会抛出“读取访问冲突。这是nullptr”例外吗?相关的知识,希望对你有一定的参考价值。
第一次在这里发布,如果这是初学者的问题,抱歉。我正在尝试为正在制作的简单游戏创建Snake类,但调试器会不断抛出奇怪的异常。
每次调试程序时,它都会将我带入一个'vector'文件,将我指向某行并说:“读取访问冲突。'this'为nullptr”。当我在不调试的情况下运行它时,它会以以下消息终止:“已退出,代码为-1073741819。”。
我已经尝试解决了几个小时,但是仍然不知道问题出在哪里。我的代码有问题吗,还是问题不就在那里?提前致谢!
在Snake.h中:
#include <vector>
class Snake
private:
std::vector<sf::RectangleShape> body;
int speed;
public:
Snake();
void draw_body(sf::RenderWindow& windowRef);
void move(sf::RenderWindow& windowRef);
void set_speed(int s);
;
在Snake.cpp中:((我还没有完成Snake :: move()的动作)
#include "Snake.h"
#include <SFML\Graphics.hpp>
Snake::Snake() : speed 10 , body sf::RectangleShape sf::Vector2f(50.f,50.f)
body.at(0).setPosition(50.f, 50.f);
void Snake::draw_body(sf::RenderWindow& windowRef)
for (sf::RectangleShape rect : body)
windowRef.draw(rect);
void Snake::set_speed(int s)
speed = s;
void Snake::move(sf::RenderWindow& windowRef)
;
在main.cpp中:
#include <SFML\Graphics.hpp>
#include <iostream>
#include "Snake.h"
class Snake;
int main()
sf::RenderWindow window(sf::VideoMode(800, 800), "MY window", sf::Style::Close | sf::Style::Titlebar);
Snake* snake;
while (window.isOpen())
sf::Event event;
while (window.pollEvent(event))
window.clear(sf::Color::White);
snake->draw_body(window);
window.display();
return 0;
这是因为您的代码具有未定义的行为(UB)。它可以偶然发生,可以失败而没有任何症状,或者最奇怪的事情可能发生。
调试器通常会格外小心,添加了很多控件。幸运的是,它发现使用了空指针。实际上,这行代码与您认为的不符:
Snake* snake;
未创建Snake
。 snake
是指向Snake
的指针。因此,您刚刚初始化了一个指针。您认为它的价值是什么?
这里最好的选择是摆脱指针:
Snake snake; // no *, so now you have a real snake object ready to use
...
snake.draw_body(window); // no -> since it's no longer a pointer
此行:
Snake* snake;
不初始化Snake类的实例,而是指向实例的指针。指针是汇编级别的整数,默认情况下被初始化为0,与C中的NULL
和现代C ++中的nullptr
相同(在汇编级别上,它们都相同)。
[要解决此问题,您需要在使用完后在new
和delete
上在Snake上分配一个实例,或者通过删除指针在堆栈上分配该实例。
以上是关于为什么调试器会抛出“读取访问冲突。这是nullptr”例外吗?的主要内容,如果未能解决你的问题,请参考以下文章