我有一个 c++ 程序,它接受一个地图文本文件并将其输出到我制作的图形数据结构中。我正在使用 QT,因为我需要跨平台程序和 GUI 以及地图的可视化表示。我有几张不同尺寸的地图(8x8 到 4096x4096)。我正在使用 unordered_map,向量作为键,顶点作为值,我正在发送 hash(1) 和我在创建时写入 unordered_map 的 equal 函数。
在 QT 下,我正在使用 QT 4.8.1 for desktop MinGW (QT SDK) 调试我的程序,该程序可以正常工作和调试,直到我尝试了 4096x4096 的最大地图,然后程序遇到以下错误:
下级停止了,因为它收到了来自操作系统的信号
调试时,程序在 unordered_map 内部使用的哈希函数处停止,而不是作为插入状态的一部分,而是在 getter(2) 处。
在 Netbeans IDE 7.2 和 Cygwin4 下一切正常(调试和运行)。
一些代码信息:
typedef std::vector<double> coordinate;
`typedef std::unordered_map<coordinate const*, Vertex<Element>*, container_hash, container_equal> vertexsContainer;`
`vertexsContainer *m_vertexes`
(1) 哈希函数:
struct container_hash
{
size_t operator()(coordinate const *cord) const
{
size_t sum = 0;
std::ostringstream ss;
for ( auto it = cord->begin() ; it != cord->end() ; ++it )
{
ss << *it;
}
sum = std::hash<std::string>()(ss.str());
return sum;
}
};
(2) 吸气剂:
template <class Element>
Vertex<Element> *Graph<Element>::getVertex(const coordinate &cord)
{
try
{
Vertex<Element> *v = m_vertexes->at(&cord);
return v;
}
catch (std::exception& e)
{
return NULL;
}
}
一开始我在想这可能是一些内存问题,所以在我考虑尝试 Netbeans 之前,我在我朋友的 16GB RAM 电脑上用 QT 检查了它,并得到了同样的错误。
更新: 我尝试在 Visual Studio 2012 上运行它,我遇到了一个 bad_alloc 错误,它停止了我的程序,当查看任务管理器时,我看到分配给程序的内存高达 2GB,可能是因为它是一个 32 位程序吗?
更新 我用 32 位架构和 Cygwin4 在 Netbeans 下调试了我的程序,一切正常,所以也许这不是 32 位问题,netbeans 使用的内存也是 1.5GB,那么在 MinGW 和 VS2012 中它如何达到 2GB?