2012-10-13 1 views
1

Я объявил зЬй :: карту в файле .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), это позволяет мне вставлять. Но когда я копирую карту темпа в глобальную карту, объявленную в заголовочном файле, она переходит в бесконечный цикл и никогда не выходит.

Это происходит со всеми переменными карты, объявленными в заголовочном файле.

+0

Просьба указать некоторые сведения о том, как вы определяете и используете 'strNode' и' counter' перед этой строкой. Еще лучше, пожалуйста, предоставьте полный исходный код. –

+0

Согласен. Вы пробовали что-то вроде 'nodes.insert (pair (« Hello », 5));' отлаживать и тестировать, работает ли карта? –

+0

Да, это также дает мне такую ​​же ошибку. Если я использую 'nodes.clear();' перед началом вставки, то он застрял в бесконечном цикле. – DataMiner

ответ

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)); 

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

EDIT: ОП изменил содержание исходного вопроса и теперь показывает, что nodes не является глобальной, а скорее является переменным членом другого класса. Все в extern в этом ответе только стало спорным.

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

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

+0

метод, который он использовал для вставки, также должен быть точным. Для 'std :: map',' value_type' является 'typedef'ed to' pair '. –

+0

Согласовано, но функция * signature * вызывает value_type, то есть:' ' pair insert (const value_type & x) 'или, по крайней мере, моя спецификация говорит об этом, поэтому я всегда использую его. – WhozCraig

+0

Да, но после компиляции нет никакой разницы. См. пример кода здесь: http://www.cplusplus.com/reference/stl/map/ insert/Независимо, 'value_type' немного чище для чтения. Но я обычно использую 'pair ', потому что это то, к чему я привык. –

 Смежные вопросы

  • Нет связанных вопросов^_^