std :: map异常[读取访问冲突_Wherenode为nullptr。 ]

时间:2020-08-24 18:23:37

标签: c++ sfml stdmap

我正在使用SFML库处理这个非常基本的纹理处理程序类。代码看起来像这样:

    // H
class TexturesHandler 
{
    friend class XML_Handler;
public:
    ...
    static TexturesHandler &init() { return m_handler; };
    sf::Texture &getTexture(std::string name);
    ...
private:

    ...
    static TexturesHandler m_handler;
    std::map<std::string, sf::Texture> m_Textures;
    void setTexture(std::string path, std::string name, const sf::IntRect& rect = sf::IntRect());
    ...
};
    // CPP
#include "TexturesHandler.h"
...
TexturesHandler TexturesHandler::m_handler;

sf::Texture &TexturesHandler::getTexture(std::string name)
{
    return m_Textures[name];
}

//private

...
void TexturesHandler::setTexture(std::string& path, std::string& name, const sf::IntRect& rect)
{
    sf::Texture texture;
    texture.loadFromFile(path, rect);
    m_Textures[name] = texture;
}

基本上,此类的工作是在游戏开始时加载所有纹理

借助XML_Handler的帮助,该类是另一个类,可从XML文件读取每个纹理的名称,路径和大小,任何需要纹理的精灵都可以调用getTexture

但是问题在于,当第一次调用setTexture函数时,运行时异常从头文件xtree2046的第3行引发,消息“读取访问冲突_Wherenode为nullptr”

请记住:

1- TextureHandler是singlton类

2-通过在函数setTexture内设置一个断点,似乎XML_Handler传递的所有参数都是正确的,并且所有参数都不设置为0或null ...

3-我尝试使用emplace和insert函数插入,但似乎不起作用

我之前从未遇到过类似的异常,并且寻找解决方案似乎并没有产生任何结果 要么。所以我的问题是:

1-为什么在尝试在地图中插入纹理时会出现此异常?

(可选)2-使用xtree作为基类的所有stl容器是什么?

编辑:

经过大量测试,看起来函数setTexture在构造函数之前被调用。我试图在两者上都设置一个断点,而函数中的一个断点要比构造函数中的一个断点更容易命中。怎么可能呢?

当我尝试访问地图时,我仍然收到运行时异常。即使它就像m_Textures [“ bla”];

另一个非常奇怪的事情是,即使XML_Handler类是一个朋友,它也可以访问TextureHandler类的所有数据成员和函数(构造函数除外),因此这是有效的:{{1} }

与此同时:TexturesHandler::init().~TexturesHandler();给出错误:

不允许输入类型名称

0 个答案:

没有答案