F流I/O/触发断点的动态分配数组

FStream I/O / Dynamically allocated arrays triggering breakpoint

本文关键字:断点 动态分配 数组      更新时间:2024-05-23

基本上,这个函数的目的是获取一组学生数据,根据学生的ID号进行排序,并将其打印到一个新文件中。断点似乎发生在写入输出文件的循环中,但我不确定,因为之后我所做的所有cout语句似乎仍然被读取到控制台。

void file_score(char* infile, char* outfile)
{
int size;
ifstream fin(infile);
fin >> size;

int *student_id = new int(size);
char *grade = new char(size);
double *gpa = new double(size);
//Creates new arrays of size that is read from file.
for (int i = 0; i < size; i++)
{
fin >> student_id[i] >> grade[i] >> gpa[i];
int temp_id = student_id[i];
char temp_grade = grade[i];
double temp_gpa = gpa[i];

int j;
for (j = (i - 1); j >= 0; j--)
{
if (student_id[j] < temp_id) {
break;
}
student_id[j + 1] = student_id[j];
grade[j + 1] = grade[j];
gpa[j + 1] = gpa[j];
}
student_id[j + 1] = temp_id;
grade[j + 1] = temp_grade;
gpa[j + 1] = temp_gpa;
//Using insertion sort to sort data as its being scanned in.    
}
fin.close();
ofstream fout(outfile);
for (int k = 0; k < size; k++)
{
fout << student_id[k] << " " << grade[k] << " " << gpa[k] << "n";
}
//Print to file
fout.close();
delete []student_id;
delete []grade;
delete []gpa;
}

这些语句是错误的:

int *student_id = new int(size);
char *grade = new char(size);
double *gpa = new double(size);

您没有分配3个数组,实际上是分配3个单个值。因此,当循环之后试图访问数组元素时,它们访问内存的方式不正确,导致未定义的行为,这可能会损坏内存。

将这些语句改为:

int *student_id = new int[size];
char *grade = new char[size];
double *gpa = new double[size];

一个更好的解决方案是直接使用std::vector而不是new[],不过:

std::vector<int> student_id(size);
std::vector<char> grade(size);
std:vector<double> gpa(size);