0

我有一个单身人士,那是一个图像管理器。当我尝试加载图像时,我以这种方式调用单例:

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));
....

问题是我收到内存访问错误。就像如果 m_imageMap 为 NULL o 初始化错误,因为在第一句中抛出异常。但正如我所说,是一个单例,所以我必须初始化地图。我在 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 指针内容的方法。

非常感谢大家

4

2 回答 2

3

std::map 不需要初始化——除了适当的构造函数提供的初始化。只要您调用了构造函数(默认的也可以),那么地图就会正确初始化。Singleton 是一个真正可怕的模式,有很多很多可怕的问题,你应该从你的代码中删除这些恶魔,但通常没有一个包含这个。您将需要发布另一个包含单例代码的问题,以获得手头实际问题的帮助。

于 2011-01-16T19:58:47.310 回答
3

我假设 m_imageMap 是一个类的常规成员变量,并且您从该类的成员函数调用它。

如果是这种情况,那么您很可能在僵尸上调用该成员函数,否则为无效指针。包含 m_imageMap 的代码行是该函数中成员变量的第一次使用吗?这是一个很常见的赠品。

调试此问题的简单方法是在调试器中查看它。只要在调试版本中发生此错误,VC++ 就会很高兴地捕获访问冲突异常并在那一刻立即中断。在局部变量观察窗口中查看“this”指针的值。它是 null 还是0xcdcdcdcd

于 2011-01-16T21:23:29.043 回答