1

.h ファイルで std::map を宣言しました

#include "pl.h"
#include <conio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <boost/algorithm/string.hpp>
#include <boost/lexical_cast.hpp>
#include <vector>
#include <map>

using namespace std;

class ReadingXDSLfile
{
public:

     ReadingXDSLfile();
     ~ReadingXDSLfile();
     void readDotXDSLFile(string fileName, ifstream &file);
     void writeNodesList();


protected:
    typedef std::map<std::string, int> nodesMap;

    nodesMap nodes;

    std::vector<string> nodesName;
    std::map<std::string, int>::iterator nodeItr, nodeItr1;
    string outFileName;
private:
};

.cpp ファイルで、次のコード行を使用して項目を挿入しようとすると、アクセス違反エラーが発生します

int counter=0;
string strNode;
...
....
....
std::pair<string, int>prNode (strNode, counter);
     nodes.insert(prNode);

エラー:

Unhandled exception at 0x0043c5d9 in testMMHC.exe: 0xC0000005: Access violation reading location 0x0000002c.

関数 (.cpp ファイル) で一時マップ変数を宣言したので、挿入できます。しかし、一時マップをヘッダー ファイルで宣言されたグローバル マップにコピーすると、無限ループに入り、終了しません。

これは、ヘッダー ファイルで宣言されたすべてのマップ変数で発生します。

4

1 に答える 1

2

まず、ヘッダーでマップの typedef を宣言することは問題ありませんが、使用しない限り、変数自体を宣言しないでくださいextern。1 つだけ存在し、.cpp ファイルに含まれている必要があります。

.h ファイル内:

#include <map>
#include <string>

typedef std::map<std::string, int> NodeMap;
extern NodeMap nodes;

次に、.cpp ファイル:

NodeMap nodes;

そして最後に、挿入に関しては、それを行う方法がたくさんあります。

std::string strIndex = "foo";
int value = 0

// one way.
nodes[strIndex] = value;

// another way
nodes.insert(NodeMap::value_type(strIndex,value));

いくつかの例を示します。

編集: OPは質問のソースコンテンツを変更しnodes、グローバルではなく、別のクラスのメンバー変数であることを示しています。externこの回答のすべてが意味不明になりました。

違反のオフセットは、反復子の 1 つまたはクラス自体が null ポインターを介して参照されていることを示しています。0x2C は NULL から 44 バイトの深さです。これは、参照されているReadingXDSLfile オブジェクトが NULL ポインターから来ている可能性が高いことを示しています。

参照されたオブジェクトがどのように割り当てられ、アクセスされているかについてのOPからの詳細情報がなければ、ヘッダー内の変数をexternする方法について明確に定義されたチュートリアル以上のものを提供することはできません.この問題とは関係ありません。

于 2012-10-13T20:30:27.123 に答える