抛出'std :: bad_alloc'的实例后调用终止c ++

时间:2018-02-04 09:03:52

标签: c++ abort bad-alloc

更新:发布错误的主...关于丢失的分割功能,我从我以前的工作中复制了该功能,所以它应该可以正常工作。 start_和end_变量是两个全局变量,在这个程序中不应该受到影响。之前我认为这是一个记忆问题,但现在我真的不知道问题是什么。谢谢你的帮助。 另外,我把主要关闭的所有指针都拿掉了,所以现在它只有引用以避免大量内存使用。

编译后我收到此错误。我查看了在线帖子,看到它可能是由于复制大型结构和耗尽内存造成的。我使用指针来避免这样的问题,但错误仍然会弹出..

在抛出'std :: bad_alloc'的实例后终止调用   what():std :: bad_alloc 中止(核心倾销)

以下是我的代码。这不是很长。

class Emiss{
public:
  Emiss() {};
  Emiss( string w ){
    word[w] = 1;
    total = 1;;
  }

  void update(string w){
    if(word.find(w) == word.end() ){
      word[w] = 1;
      total++;
    }
    else{
      word[w]++;
      total++;
    }
  }

  void emissProb( ofstream& outfile ){
    for(std::map<string, int>::iterator it = word.begin(); it != word.end(); ++it){
      outfile << std::left << setw(20) << it->first << setprecision(5) << it->second/(1.0*total) << endl;
    }
  }

  map<string, int> word;
  int total;
};

这是一堂课。另一类几乎与这一类相同,但有不同的用途。

 class Trans{
  public:
    Trans() {};
    Trans( string n ){
      next[n] = 1;
      total = 1;
    }

    void update(string t){
      if(next.find(t) == next.end() ){
        next[t] = 1;
        total++;
      }
      else{
        next[t]++;
        total++;
      }
    }

    void transProb( ofstream& outfile ){
      for(std::map<string, int>::iterator it = next.begin(); it != next.end(); ++it){
        outfile << std::left << setw(20) << it->first << setprecision(5) << it->second/(1.0*total) << endl;  
      }
    }

    map<string, int> next;
    int total;
};

然后输出到文件的函数

void probs( map<string, Emiss>& emiss, map<string, Trans>& trans, ofstream& outfile ){
  //map<string, Emiss> *emiss = &e;
  //map<string, Trans> *trans = &t;
  std::map<string, Emiss>::iterator ite;
  std::map<string, Trans>::iterator itt;
  for(ite = emiss.begin(); ite != emiss.end(); ++ite){
    outfile << ite->first << ": "<<endl;
    emiss[ite->first].emissProb(outfile);
  }
  for(itt = trans.begin(); itt != trans.end(); ++itt){
    outfile << itt->first << ": "<<endl;
    trans[itt->first].transProb(outfile);
  }

}

然后它只是我的主函数,它读入一个非常大的文件并解析为两个类的向量

int main(int argc, char* argv[]){
  if(argc != 2){ 
    std::cerr << "Insufficient command argument";
    return 1;
  }
  string inputf = argv[1];
  string outf = "trans_emiss.txt";
  std::ifstream istr(argv[1]);
  if(!istr){
    std::cerr << "ERROR: Invalid arguments \nUSAGE: ./a.out "+ inputf +" "+ outf << endl;
    return EXIT_FAILURE;
  }

  std::ofstream out_str(outf);
  if(!out_str) { 
    std::cerr << "ERROR: Invalid arguments \nUSAGE: ./a.out "+ inputf +" "+ outf <<endl;
    return EXIT_FAILURE;
  }

  string line;//each line of the file
  string prev = "_START";//previous tag
  vector<string> word;
  map<string, Emiss> emiss;
  map<string, Trans> trans;

  while( getline(istr,line) ){
    istringstream iss(line);
    if( line[0] == '#' || line.empty() ){
      if(start_ != end_){
        if( trans.find(prev) == trans.end() ){
          Trans t("_END");
          trans[prev] = t;
        }
        else{
          trans[prev].update("_END");
        }
        prev = "_START";
        end_++;
      }
      continue;
    }
    //if is a token
    word = split(line, ' ');
    if( word[0].compare("1") == 0){
      start_ ++;
    }
    if( emiss.find( word[4]) == emiss.end() ){
      Emiss e(word[2]);
      emiss[ word[4] ] = e;
    }
    else{
      emiss[ word[4] ].update( word[2] );
    }
    if( trans.find(prev) == trans.end() ){
      Trans t( word[4] );
      trans[ prev ] = t;
    }
    else{
      trans[ prev ].update( word[4] );
    }
    prev = word[4];
  }
  if(start_ != end_){
    if( trans.find(prev) == trans.end() ){
      Trans t("_END");
      trans[prev] = t;
    }
    else{
      trans[prev].update("_END");
    }
    prev = "_START";
    end_++;
  }
  probs(emiss, trans, out_str);

  out_str.close();
  return 0;
}

0 个答案:

没有答案