C++ 为什么在字符队列的前面导致错误分配? myclass::myclass(队列构造信息){ //为什么这条线会崩溃? 队列的第一行\u of_construction\u info=construction\u info.front(); 构造_info.pop(); }

C++ 为什么在字符队列的前面导致错误分配? myclass::myclass(队列构造信息){ //为什么这条线会崩溃? 队列的第一行\u of_construction\u info=construction\u info.front(); 构造_info.pop(); },c++,c++11,C++,C++11,我正在从文本文件(不是由我生成的,所以我无法更改格式)读取到一个字符队列。它意味着一行行字符。我处理这些信息来生成类。然而,在处理了一些调试消息之后,我意识到我第一次在execute(程序在启动时从文本文件初始化了所有MyClass)上得到错误的alloc是代码中的这一行 我刚开始使用C++,我的谷歌FU并没有真正帮助我解决这个问题。有没有人对我从哪里着手解决这场车祸有什么建议 简单地取消对类构造函数的注释就是让我的程序在没有任何崩溃的情况下工作,当然也不会生成实际有用的对象 在linux上使用

我正在从文本文件(不是由我生成的,所以我无法更改格式)读取到一个字符队列。它意味着一行行字符。我处理这些信息来生成类。然而,在处理了一些调试消息之后,我意识到我第一次在execute(程序在启动时从文本文件初始化了所有MyClass)上得到错误的alloc是代码中的这一行

我刚开始使用C++,我的谷歌FU并没有真正帮助我解决这个问题。有没有人对我从哪里着手解决这场车祸有什么建议

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

在linux上使用g++和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();
}
int初始化_教室(){
路径p=“文件/教室/”;
//字符队列行的文件
//字符队列的向量
矢量文件;
如果(存在(p)){
for(目录项&x:directory迭代器(p)){
队列cur_文件;
ifstream文件(x.path().filename().string());
排队线路;
char ch;
while(文件>>noskipws>>ch){
如果(!isspace(ch)){
电流推送(ch);
}else if(ch='\n'){
cur_file.push(cur_行);
cur_line=queue();
}
}
教室文件。推回(当前文件);
cur_file=queue();
file.close();
}
}否则{
cout如果目标只是读取(前面队列的)内容,那么最好创建一个(常量)引用

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;
}
再看看代码的其余部分,您可能不希望这些队列的多个副本四处浮动


旁白:除非有其他限制,而不是使用<代码>队列<代码>来存储一行文本,考虑使用<代码> STD::String 。< /P>队列有多大?<代码> BADYOLLC/<代码>通常意味着内存用完了。你怎么知道队列中有什么东西?在得到一个项目之前,你能得到队列的大小吗?@ Pa乌鲁尼:我加入了新一代code@JerryJeremiah哦,对了,建筑信息是空的同样正确。我正在查看生成代码以了解原因。为什么您首先要使用

std::queue
?为什么不
std::queue
?或者仅仅是
std::string
本身?为什么要使用
std::vector
而不是
std::vector
?为什么您要逐字符而不是逐行读取文件-行(例如通过
std::getline()
)?每个单独的
char
是否确实需要单独处理?或者您需要处理行吗?您真的需要多层队列吗?还是只需要一个文件中的行列表?此代码使用了大量开销来完成一些本应微不足道的事情。我假设我的代码正在创建前端的副本()现在,通过你的回答,我明白了常量引用是如何工作的。但是,你能告诉我如何创建一个副本,这样我就可以看到区别了。
myclass
构造函数也应该通过引用而不是通过值来获取
construction\u info
,这样它实际上就作用于原始的
队列
而不是副本。@RemyLebeau这是因为复制它只是浪费,还是因为其他问题而建议这样做?我使用字符队列而不是字符串,因为文本文件格式非常糟糕,而且似乎更容易删除我读到的文本,这样我就不必处理一堆子字符串了和索引计算。当然,我不确定这是否是使用它们的完美理由,但就目前而言,我对fifo结构感到满意。我认为没有理由逐字符而不是逐行处理文件内容。解析行非常容易,例如使用
std::istringstream
。我真的不认为需要多层当一个队列就足够时,队列的数量就足够了(最好完全摆脱队列,只使用
向量本身)
queue<char> const& first_line_of_construction_info = construction_info.front();
            ^^^^^^
myclass::myclass(queue<queue<char> > const& construction_info) {
                                     ^^^^^^