我有一个单身人士,那是一个图像管理员。当我尝试加载图像时,我以这种方式调用单例:
utils::CImageBuff* img4 = utils::CImageManager::getInstance()->loadFromFile("uswg.png");
然后,在loadFromFile方法中,我将图像存储到地图中:
m_imageMap[imageHashID].setHeight(ilGetInteger(IL_IMAGE_HEIGHT));
m_imageMap[imageHashID].setWitdh(ilGetInteger(IL_IMAGE_WIDTH));
m_imageMap[imageHashID].setBpp(ilGetInteger(IL_IMAGE_BPP));
....
问题是我收到了mem访问错误。如果m_imageMap是NULL,则初始化错误,因为在第一句中抛出了excepttion。但正如我所说,是一个单身人士所以地图必须我初始化。我正在开发VC ++ 2008.它可能是一个错误的编译/ .obj文件?
昨天运作良好
一些建议?
编辑: m_imageMap的声明非常简单:
typedef std::map<unsigned int,utils::CImageBuff> t_imageMap;
作为附加信息,生成的异常位于文件output.c的第1643行。
编辑嗯,我对这个案子非常失望。我已经改变了代码,所以现在这个类不再是单例了。现在只有m_imageMap是静态的,可以从任何地方看到所有加载的图像。但仍然以同样的方式失败。该错误是访问冲突。此外,如果我通过此代码更改所有方法代码:
utils::CImageBuff im;
m_imageMap[1] = im; // fails here
return &im;
仍然失败。它就像地图是空的或以任何方式锁定,甚至是初始化不好,但我不知道。你能帮忙吗?
如果您需要更多代码,我会粘贴,但我认为使用这三行代码可以简化问题。
编辑:最后解决了最后我改变了
std::map<unsigned int,utils::CImageBuff>
到
std::map<unsigned int,utils::CImageBuff*>
现在它有效。现在我只需要想一个方法来删除指针的静态std :: map的内容。
非常感谢所有
答案 0 :(得分:3)
我假设m_imageMap是一个类的常规成员变量,你从该类的成员函数调用它。
如果是这种情况,那么你很可能在僵尸上调用该成员函数,否则返回null无效指针。带有m_imageMap的代码行是否在该函数中首次使用成员变量?这是一个非常普遍的赠品。
调试此问题的简便方法是在调试器中查看它。只要在调试版本中发生此错误,VC ++就会很高兴地捕获访问冲突异常并在那一刻突破该错误。查看局部变量监视窗口中“this”指针的值。是null还是0xcdcdcdcd?
答案 1 :(得分:2)
std :: map不需要初始化 - 除了由适当的构造函数提供的初始化。只要你调用了一个构造函数(默认值也很好),就可以正确初始化地图。 Singleton是一个真正可怕的模式,有许多可怕的问题,你应该从你的代码中删除这些恶魔,但它们通常都不包括这个。您需要在其中发布包含Singleton代码的其他问题,以获得有关手头实际问题的帮助。