0

マップテキストファイルを取得して、作成したグラフデータ構造に出力する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になりますか?

4

0 に答える 0