Вставка std :: map застряла в бесконечном цикле или выдает ошибку нарушения доступа

Я объявил std :: map в файле .h

#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

Решение

Во-первых, можно объявить 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));

показать несколько примеров.

РЕДАКТИРОВАТЬ: ОП изменил исходное содержание вопроса и теперь показывает, что nodes не является глобальным, а скорее является переменной-членом другого класса. Все о extern в этом ответе просто стал спорным.

Смещение нарушения указывает, что на один из итераторов или на сам класс ссылается нулевой указатель. 0x2C имеет глубину 44 байта от NULL, что указывает на то, что ReadingXDSLfile объект ссылка на него, вероятно, исходит из нулевого указателя.

Без дополнительной информации от OP о том, как ссылаться на объект, на который делается ссылка, и получить к нему доступ, я уверен, что не смогу предложить намного больше, чем четко определенное руководство по извлечению переменной в заголовке, что должно быть очевидным не имеет ничего общего с этой проблемой.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]