第1322行中的C ++运行时库错误

时间:2016-02-07 12:19:48

标签: c++ runtime-error sfml

我正在使用SFML 2.2制作小游戏

我将从我的代码开始。由于我已经拥有大约4000行工作代码,因此我制作了一个纹理管理器,用于存储一次使用的所有纹理。我当然早些时候使用过纹理,但我需要一种方法来管理它们。它看起来像这样:

//Declarations

class Manager
{
private:
    static map<string, Texture > textures;
public:
    static Texture & add(const string & name, const string & directory);
    static Texture & resolve(const string & name);
};

//Definitions

Texture & Manager::add(const string & name, const string & directory)
{
    // Check, whether a said texture was already maped
    map<string, Texture>::const_iterator it = textures.find(name);
    if (it != textures.end())
    {
        cout << "Said element was loaded" << endl;
        return textures.at(name);
    }

    // Adding a new texture
    Texture tex;
    tex.loadFromFile(directory);
    textures[name] = tex;

    cout << "Texture added" << endl;
    return textures.at(name);
}

Texture & Manager::resolve(const string & name)
{
    cout << "Resolved" << endl;
    return textures.at(name);
}

map<string, Texture > Manager::textures;

正如你所看到的,我有一个全局地图,有两种方法可供选择。两种方法都返回对某个纹理的引用。因此,当我的项目已经安静了许多纹理时,我决定检查我的管理器是否工作正常,并用方法 add 替换加载一个纹理,并用 resolve 将其绑定到sprite。当我编译代码并运行它时,一切运行良好,直到我回到我的游戏菜单并决定再次播放&#34;。现在,当再次加载纹理时,方法添加正确识别的名称(键)已经使用,方法 resolve 返回正确的纹理。至少&#34;已解决&#34;出现在屏幕上。这就是错误发生的时候。

但是当我从方法中调用 add 时,纹理被用于使用它的类的构造函数,它再次正常工作。它被称为相同的次数;每次玩游戏&#34;。

以下是无效代码:

void Engine::set_up(int & lvl)
{
    srm::Manager::add("Loading screen", "data/loading_screen.png");

    Sprite spr;
    spr.setTexture(srm::Manager::resolve("Loading screen"));

    // ...
}

也没有工作代码:

void Engine::set_up(int & lvl)
{
    Sprite spr;
    spr.setTexture(srm::Manager::add("Loading screen", "data/loading_screen.png");

    // ...
}

工作:

//Constructor
Engine(){ srm::Manager::add("Loading screen", "data/loading_screen.png"); }

//Method
void Engine::set_up(int & lvl)
{    
    Sprite spr;
    spr.setTexture(srm::Manager::resolve("Loading screen"));

    // ...
}

我觉得我的经理犯了一个错误。这是错误所说的:

Microsoft Visual C++ Runtime Library - Error

使用了词&#34;堆&#34;所以它只是证实了我的错误与我的经理有关。我在网上做了一个研究,我发现了这个:

Debug Assertion Failed: _CrtIsValidHeapPointer(pUserData)

我明白导致错误的原因,但我无法理解错误在哪里。最奇怪的是那些在构造函数中调用 add 的人工作并在其他地方调用它不会!

对不起,如果事情不清楚,我会回答你的问题。

有人知道这个问题的解决方案吗?你能解释一下我的代码中有什么问题吗?提前谢谢!

修改

好的,我在调试模式下跟踪堆栈并找到了罪魁祸首。这些是具有字段值

的sf :: Text对象
  

信息不可用,未加载符号   SFML图形-d-2.DLL

并且在每个测试中它都出现在其他Text对象中。始终存在字符串问题,它始终是&#34;无法读取内存&#34;在我的文本的字符串部分。我不知道为什么,对我而言,它甚至与我的问题无关。但是,当我将代码更改回此时:

void Engine::set_up(int & lvl)
{
    //srm::Manager::add("Loading screen", "data/loading_screen.png");
    Texture texture;
    texture.loadFromFile("data/loading_screen.png");
    Sprite spr;
    spr.setTexture(texture);
    //spr.setTexture(srm::Pojemnik::zwroc("Ekran wczytywania"));

这是一个经典的本地sf::Texture对象并将其绑定到精灵,一切都完美无缺。

正如我所说,当我把

srm::Manager::add("Loading screen", "data/loading_screen.png");

到构造函数或当我没有使用我的Manager类时,一切正常,当我想使用我的代码时 - 它会挂起。

0 个答案:

没有答案