マップテキストファイルを取得して、作成したグラフデータ構造に出力するc++プログラムがあります。クロスプラットフォームプログラムとGUI、およびマップの視覚的表現が必要だったため、QTを使用しています。サイズの異なる(8x8から4096x4096)マップがいくつかあります。ベクトルをキー、頂点を値としてunordered_mapを使用しています。作成時に、unordered_mapに書き込んだhash(1)と同等の関数を送信しています。
QTでは、デスクトップMinGW(QT SDK)用のQT 4.8.1を使用してプログラムをデバッグしています。プログラムは、最大の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を搭載した友人のPCでQTをチェックしたところ、同じエラーが発生しました。
更新: これをVisual Studio 2012で実行しようとすると、プログラムを停止するbad_allocエラーが発生しました。タスクマネージャーを見ると、プログラムに割り当てられたメモリが最大2 GBになっていることがわかりました。これは、32ビットプログラムであるためでしょうか。
更新 32ビットアーキテクチャとCygwin4を使用してNetbeansでプログラムをデバッグしましたが、すべて正常に動作しました。32ビットの問題ではなく、netbeansで使用されるメモリも1.5 GBでしたが、MinGWとVS2012では最大2 GBになりますか?