简体   繁体   English

C++ 代码永远运行并占用内存

[英]C++ code runs forever and eats memory

It seems to be in MakeData function, as that is what breaks the execution.它似乎在 MakeData 函数中,因为这是中断执行的原因。 I am very unsure as to why this is not working, as my instructor and many of my classmates have almost identical execution and it is fine.我非常不确定为什么这不起作用,因为我的导师和我的许多同学的执行几乎相同,而且很好。 I know for a fact that an almost identical version of this code, with windows file name, also does not run on windows.我知道这个代码的几乎相同版本(带有 Windows 文件名)也不能在 Windows 上运行。 I have compiled the code.我已经编译了代码。 I have run debuggers.我已经运行了调试器。 Nothing turns up.什么都没有出现。 The debuggers I have run have just run the code until either very obscure errors turn up or it essentially indicates that the process is in some kind of an infinite loop.我运行的调试器只是运行代码,直到出现非常模糊的错误,或者它本质上表明该过程处于某种无限循环中。 Any help would be appreciated!任何帮助,将不胜感激!

/*
 *Program Description:A program to sort a series of strings and scores from a file.
 *
 *Programmer:Timothy A. Gass
 *Date:01/17/17
*/

#include <iostream>
#include <string>
#include <math.h>
#include <fstream>
#include <vector>
#include <ctime>

using namespace std;

void makeData(string);
void getData(vector<string> &, vector<int> &, string);

int main(){
  srand(time(0));
  string fname = "/home/tim/dev/c++/chpt9/data.txt";
  vector<string> name;
  vector<int> score;
  makeData(fname);
  getData(name, score, fname);
  for(int i = 0; i < score.size(); i++){
    cout << score[i] << endl;
    cout << name[i] << endl;
  }
  cout << "Press enter to exit." << endl;
  cin.ignore();
  cin.get();
  return 0;
}

void makeData(string fname){
  int rand1, rand2, rand3;
  const int SCORE_MAX_SIZE = 100;
  ofstream make(fname);
  const int PEOPLE_NUM = 50;
  vector<string> firstNames = {
    "Gus",
    "Taneka",
    "Shane",
    "Rosella",
    "Bennett",
    "Filiberto",
    "Khadijah",
    "Mafalda",
    "Rusty",
    "Janiece",
    "Shavonne",
    "Azalee",
    "Enedina",
    "Heidy",
    "Lavelle",
    "Darleen",
    "Ashton",
    "Glynis",
    "Gale",
    "Norene",
    "Madaline",
    "Elvin",
    "Jacqueline",
    "Kristofer",
    "Zachary",
    "Lorretta",
    "Jim",
    "Shanelle",
    "Tonja",
    "Alethia",
    "Kasha",
    "Katheleen",
    "Joyce",
    "Kirstin",
    "Neil",
    "Belkis",
    "Maisha",
    "Doretha",
    "Eliseo",
    "Rhiannon",
    "Annamarie",
    "Latoria",
    "Jerica",
    "Betsey",
    "Delinda",
    "Pamula",
    "Porsha",
    "Fredia",
    "Wilda",
    "Belen"
  };

  vector<string> lastNames = {
    "Best",
    "Shields",
    "Finley",
    "Blankenship",
    "Hobbs",
    "Nichols",
    "Mcneil",
    "Robles",
    "Moyer",
    "Hays",
    "Elliott",
    "Ruiz",
    "Ritter",
    "Gamble",
    "Zamora",
    "Cole",
    "Larson",
    "Ibarra",
    "Choi",
    "Santana",
    "Gray",
    "Crane",
    "Campos",
    "Wright",
    "Morris",
    "Flores",
    "Newman",
    "Santos",
    "Li",
    "Archer",
    "Chavez",
    "Avery",
    "Mora",
    "Liu",
    "Lutz",
    "Miles",
    "Stewart",
    "Austin",
    "Wu",
    "Turner",
    "Brennan",
    "Ferrell",
    "Mcmillan",
    "Whitney",
    "Odonnell",
    "Conley",
    "Maxwell",
    "Stafford",
    "Carlson",
    "Peck"
  };

  for(int i = 0; i < PEOPLE_NUM; i++){
    rand1 = rand()%50;
    rand2 = rand()%50;
    rand3 = rand()%(SCORE_MAX_SIZE+1);
    make << firstNames.at(rand1) + " " + lastNames.at(rand2) << endl;
    make << rand3 << endl;
  }
}

void getData(vector<string> &name, vector<int> &score, string fname){
  ifstream get(fname);
  string str;
  int num;
  if(get.fail()){
    cout << "File could not be opened!" << endl;
  }
  else
   {
     while(!get.eof())
     {
      getline(get, str);
      get >> num;
      cin.ignore();
      name.push_back(str);
      score.push_back(num);
     }
  }
}

The comment made by Xin Huang was correct.黄鑫的评论是正确的。 It turns out the use of getline and cin resulted in some form of infinite loop that would eat memory, until the computer would eventually crash.事实证明,使用 getline 和 cin 会导致某种形式的无限循环,这会消耗内存,直到计算机最终崩溃。 I still have no idea why there is no solution to this, or why using cin and getline together could have such terrible consequences, especially considering there were really no error codes.我仍然不知道为什么没有解决方案,或者为什么将 cin 和 getline 一起使用会产生如此可怕的后果,尤其是考虑到确实没有错误代码。 Even still, replacing cin with getline in the getData function and then converting back to integer yields a clean program.即便如此,在 getData 函数中用 getline 替换 cin 然后转换回整数会产生一个干净的程序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM