std :: map insert卡在无限循环中或给出访问冲突错误

时间:2012-10-13 20:04:34

标签: c++ access-violation stdmap

我在.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文件)中声明了一个临时映射变量,它允许我插入。但是当我将临时映射复制到头文件中声明的全局映射时,它会进入无限循环并且永远不会退出。

在头文件中声明的所有地图变量都会发生。

1 个答案:

答案 0 :(得分:2)

首先,在标题中为地图声明typedef很好,但除非使用extern,否则不要声明变量本身。应该只有一个,它应该在你的.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的所有内容都变得毫无意义。

违规的偏移量表明其中一个迭代器或类本身是通过空指针引用的。 0x2C是44位字节深度关闭NULL,向我指出被引用的ReadingXDSLfile 对象 可能来自NULL指针。

如果OP没有提供有关如何分配和访问引用对象的更多信息,我无法提供更多关于如何在头中替换变量的明确定义的教程,这应该是显而易见与此问题无关。