所以这是我遇到push_back问题的函数:
void School::PushBackS(ifstream &in) {
string a, b, c, d;
while(getline(in, a)) {
getline(in, b);
getline(in, c);
getline(in, d);
t.SetStudentID(a);
t.SetName(b);
t.SetAddress(c);
t.SetPhone(d);
students.push_back(Student(a, b, c, d));
cout << t.ToStringS();
}
}
这是主要的实现(我不认为这里有问题,但以防万一):
ifstream in;
School s;
in.open(argv[1]);
if(in.is_open()) {
s.PushBackS(in);
}
in.close();
我尝试过推回Object t,并推回新的Student(),但都没有工作。
它旨在从文件读入并将其推回到对象中。一切都很完美,但它并没有推向学生的向量。
如果这很重要:函数PushBackS()在一个类中,它调用一个具有ToStringS()和Set函数的单独类,类和main之间似乎没有任何通信问题,因为它打印出ToString没有问题。唯一的问题似乎与push_back本身有关。
感谢您的帮助。抱歉,我的格式有点奇怪。
更新:所以发生了一件非常奇怪的事情。输入这个函数会清除我的前两个向量,然后单独留下第三个向量。
void School::CalcGPA(vector<Grade> &myVector, vector<double> &gpa, vector<string> names) {
//opening this function clears my Student and Grade vectors, Query vector remains populated
Grade temporary;
for(size_t i; i < query.size(); i++) {
myVector.clear();
for(size_t j; j < grade.size(); j++) { //segmentation fault on this line
if(query[i].GetNum() == grade[j].GetNumber()) {
cout << grade[j].ToStringG();
temporary.GetGrade();
myVector.push_back(temporary);
}
if (myVector.size() != 0) {
for(size_t k = 0; k < myVector.size(); k++){
temporary = myVector[k];
temporary.GPA(gpa[i]);
}
gpa[i] = gpa[i]/myVector.size();
}
else {
gpa[i] = 0.0;
}
}
if(query.size() == gpa.size() == names.size()) {
cout << query[i].ToStringQ() << "\t" << gpa[i] << "\t" << names[i] << endl;
}
else {
cout << "error, vector sizes do not match" << endl;
}
}
}
有谁知道发生了什么?我知道在打开这个函数之前,我的所有向量都是完全填充的,而且之后,它们不是。我以前从来没有这样的事情。我正在使用g ++进行编译,如果这可能是问题。
答案 0 :(得分:0)
我怀疑gpa
数组的大小不正确且语句
gpa[i] = 0.0;
导致内存损坏。
您应该使用at()
函数而不是[]
运算符,因为它执行边界检查。 vector<string>
论证也是可疑的;它应该是const vector<string>&
,因此不会复制。