为什么得到导致bad_alloc的char队列队列的前面?

时间:2017-05-04 01:41:38

标签: c++ c++11

myclass::myclass(queue<queue<char> > construction_info){
  //why does this line crash?
  queue<char> first_line_of_construction_info = construction_info.front();
  construction_info.pop();
}

我正在从文本文件(不是由我生成,因此我无法更改格式)中读取到char队列队列中。它意味着字符行。然后我处理该信息以生成类。但是,在处理了一些调试消息后,我意识到第一次执行bad_alloc(程序在启动时从文本文件初始化所有myclasses)就是代码中的这一行。

我是新手使用C ++而我的google-fu并没有真正帮助我解决这个问题。有没有人建议我可以从哪里开始解决这次崩溃?

简单地取消注释类构造函数是让我的程序在没有任何崩溃的情况下工作,显然当然没有生成实际有用的对象。

在linux上使用g ++和c ++ 11。

编辑:

以下是从主文件剪切的完整代码:

int initialize_classrooms(){
  path p = "files/classrooms/";
  //files of lines of queues of chars
  //vector of vector of queue of char
  vector<queue<queue<char> > > classroom_files;
  if(exists(p)){
    for (directory_entry& x : directory_iterator(p)){
      queue<queue<char> > cur_file;

      ifstream file(x.path().filename().string());

      queue<char> cur_line;
      char ch;
      while (file >> noskipws >> ch) {
        if(!isspace(ch)){
          cur_line.push(ch);
        }else if(ch == '\n'){
          cur_file.push(cur_line);
          cur_line = queue<char>();
        }
      }
      classroom_files.push_back(cur_file); 
      cur_file = queue<queue<char> >();
      file.close();
    }
  }else{
    cout << "Classroom files are missing!" << endl;
    return 1;
  }
  cout << "Got all the way to classroom creation" << endl;
  int i = 1;
  for(auto cf : classroom_files){
    cout << "Number of loops: " << i << endl;
    i++;
    shared_ptr<classroom> cr = shared_ptr<classroom>(new classroom(cf));
  }
  cout << "Got past the classroom creation" << endl;
  return 0;
}

1 个答案:

答案 0 :(得分:0)

如果目标只是读取内容(前面队列),则首选创建(常量)引用。

queue<char> const& first_line_of_construction_info = construction_info.front();
            ^^^^^^

在“阅读”之后,它可以pop编辑,就像在当前代码中一样。

编辑:(感谢@Remy Lebeau) 由于副本是废物,myclass构造函数可以通过引用而不是值来取construction_info

myclass::myclass(queue<queue<char> > const& construction_info) {
                                     ^^^^^^

查看其余的代码,您可能不希望这些队列队列的多个副本浮动。

除此之外:除非另有限制,否则请考虑使用queue<char>,而不是使用std::string来存储一行文字。