我正在使用单词和标签解析文本文件(看起来像word / tag)。我试图在我的文件中找到唯一标记的数量,并在C ++中使用无序集来插入标记。但是我似乎随机得到这个异常:插入(在一定数量的插入之后)插入到我的无序集合中的“EXC_I386_GPFLT”。我不认为我的内存耗尽,因为Xcode说我只使用~300 - 400 KB。
这是我的主要功能:
#include <iostream>
#include "ParseTrain.h"
int main(int argc, const char * argv[])
{
ParseTrain p("~/Desktop/treebank.5290.train");
std::cout<<"The Number of Tags is: "<<p.getSizeOfTag()<<std::endl;
return 0;
}
这是我的ParseTrain.cpp:
#include "ParseTrain.h"
#include <fstream>
#include <string>
#include <iostream>
ParseTrain::ParseTrain(std::string fName){
std::ifstream file(fName);
std::string word;
if(!file)
return;
//read file by word
while(file >> word ){
char * cWord = new char (word.size()+1);
std::strcpy(cWord,word.c_str());
char *p = std::strtok(cWord, "/");
std::string key = p;
p = strtok(NULL, " ");
std::string value = p;
std::cout<<value<<std::endl;
_tag.insert(value);//getting exception thrown after undeterminable number of inserts at this line
delete [] cWord;
cWord = NULL;
}
}
这是我的ParseTrain.h:
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <unordered_set>
class ParseTrain{
private:
//map to relate the work and part of speech tag
std::vector <std::map<std::string, std::string>> _sentence;
std::unordered_set<std::string> _tag;
public:
//constructor to parse file
//takes in path to file to parse
ParseTrain(std::string fName);
inline size_t getSizeOfTag(){
return _tag.size();
}
};
最后这里是我试图解析并获取标签的文本文件的一小部分:
Pierre/NP Vinken/NP ,/, 61/CD years/NNS old/JJ ,/, will/MD join/VB the/DT board/NN as/IN a/DT nonexecutive/JJ director/NN Nov./NP 29/CD ./.
Mr./NP Vinken/NP is/VBZ chairman/NN of/IN Elsevier/NP N.V./NP ,/, the/DT Dutch/NP publishing/VBG group/NN ./.
我真的无法弄清楚插入时抛出异常的原因。我唯一能想到的是,无序集的大小可能有限,但考虑到我使用这么少的内存,这似乎很奇怪。任何帮助将不胜感激。
答案 0 :(得分:4)
此:
char * cWord = new char (word.size()+1);
应该是这样的:
char * cWord = new char [word.size()+1];
注意括号。
第一个字节分配一个字节,并将其初始化为word.size()+1
。第二个分配word.size()+1
个字节。