为什么调试器会抛出“读取访问冲突。这是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;

未创建Snakesnake是指向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相同(在汇编级别上,它们都相同)。

[要解决此问题,您需要在使用完后在newdelete上在Snake上分配一个实例,或者通过删除指针在堆栈上分配该实例。

以上是关于为什么调试器会抛出“读取访问冲突。这是nullptr”例外吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PasteSpecial 方法有时会抛出错误 1004?

为啥这个新创建的 MVC 应用程序会抛出这个错误?

为啥有时会抛出 FileNotFoundException

为啥geoip会抛出异常?

有效处理Java异常三原则

为啥 FileOutputStream 会抛出 FileNotFoundException?