检测到堆损坏:在正常块 c++ 动态 2D 数组之后
Heap Corruption Detected: after normal block c++ dynamic 2D array
我不断收到此错误 检测到堆损坏:正常阻止后...仅当我尝试使用 delete[] 解除分配我的 2D 数组考试分数的内存时,它才会出现。我使用 for 循环删除每个数组,所以我很困惑,某处还有内存泄漏吗?我对内存管理不是很熟悉,所以提前感谢您的任何帮助
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
using namespace std;
string getGradeOfExam(double grade, double examAverage) {
if (grade <= (examAverage - 15)) return "E";
if (grade >= (examAverage + 15)) {
return "A";
}
if (grade < (examAverage - 5)) return "D";
if (grade > (examAverage + 5)) return "B";
return "C";
}
string readNextName(ifstream& inputStream) {
string firstName;
string lastName;
inputStream >> firstName;
inputStream >> lastName;
string fullName = firstName + " " + lastName;
return fullName;
}
int readNextExamScore(ifstream& inputStream) {
int examGrade;
inputStream >> examGrade;
return examGrade;
}
int main(int argc, char* argv[]) {
if (argc < 3)
{
cerr << "Please provide name of input and output files";
return 1;
}
cout << "Input file: " << argv[1] << endl;
ifstream in(argv[1]);
if (!in)
{
cerr << "Unable to open " << argv[1] << " for input";
return 2;
}
cout << "Output file: " << argv[2] << endl;
ofstream out(argv[2]);
if (!out)
{
in.close();
cerr << "Unable to open " << argv[2] << " for output";
return 3;
}
int numStudents = 0;
int numExams= 0;
in >> numStudents >> numExams;
string* studentNames = new string[numStudents];
//first value corresponds to a specific student, second value corresponds to a specific exam
int** examScores = new int* [numStudents];
for (int i = 0; i < numExams; ++i) {
examScores[i] = new int[numExams];
}
for (int i = 0; i < numStudents; i++) {
studentNames[i] = readNextName(in);
for (int j = 0; j < numExams; j++) {
examScores[i][j] = readNextExamScore(in);
}
}
//Finds averages of all exams and stores them in an array
double* examAverages = new double[numExams];
for (int i = 0; i < numExams; i++) {
double examAverage = 0.0;
double totalExamScore = 0.0;
for (int j = 0; j < numStudents; j++) {
totalExamScore += examScores[j][i];
}
examAverage = totalExamScore / numStudents;
examAverages[i] = examAverage;
}
double totalExamScore = 0.0;
double totalExamAverage = 0.0;
for (int i = 0; i < numExams; i++) {
totalExamScore += examAverages[i];
}
totalExamAverage = totalExamScore / numExams;
double* studentAverages = new double[numStudents];
for (int i = 0; i < numStudents; i++) {
double studentTotalScore = 0.0;
for (int j = 0; j < numExams; j++) {
studentTotalScore += examScores[i][j];
}
studentAverages[i] = studentTotalScore / numExams;
}
//OUTPUT
out << "Student Scores:" << endl;
for (int i = 0; i < numStudents; i++) {
out << right << setw(6) << studentNames[i] << "t";
for (int j = 0; j < numExams; j++) {
out << examScores[i][j] << "t";
}
out << endl;
}
out << endl;
out << "Exam Averages:" << endl;
for (int i = 0; i < numExams; i++) {
out << setw(6) << "Exam " << i + 1 << " average = " << fixed << setprecision(1) << examAverages[i] << endl;
}
out << endl;
out << "Student Exam Grades:" << endl;
for (int i = 0; i < numStudents; i++) {
out << right << setw(6) << studentNames[i] << "t";
for (int j = 0; j < numExams; j++) {
out << examScores[i][j] << " ";
out << "(" << getGradeOfExam(examScores[i][j], examAverages[j]) << ")t";
}
out << endl;
}
out << endl;
out << "Exam Grades:" << endl;
for (int i = 0; i < numExams; i++) {
int gradeCount[5] = { 0,0,0,0,0 };
for (int j = 0; j < numStudents; j++) {
if (getGradeOfExam(examScores[j][i], examAverages[i]) == "A") {
gradeCount[0]++;
}
else if (getGradeOfExam(examScores[j][i], examAverages[i]) == "B") {
gradeCount[1]++;
}
else if (getGradeOfExam(examScores[j][i], examAverages[i]) == "C") {
gradeCount[2]++;
}
else if (getGradeOfExam(examScores[j][i], examAverages[i]) == "D") {
gradeCount[3]++;
}
else if (getGradeOfExam(examScores[j][i], examAverages[i]) == "E") {
gradeCount[4]++;
}
}
out << setw(6) << "Exam " << i + 1 << "t" << fixed << setprecision(1) << examAverages[i] << "t";
out << gradeCount[0] << "(A)" << "t";
out << gradeCount[1] << "(B)" << "t";
out << gradeCount[2] << "(C)" << "t";
out << gradeCount[3] << "(D)" << "t";
out << gradeCount[4] << "(E)" << endl;
}
out << endl;
out << "Student final grades:" << endl;
for (int i = 0; i < numStudents; i++) {
out << studentNames[i] << "t" << studentAverages[i] << "(" << getGradeOfExam(studentAverages[i], totalExamAverage) << ")" << endl;
}
out << "Class Average Score: " << totalExamAverage << endl;
delete[] studentNames;
for (int i = 0; i < numStudents; i++)
{
delete[] examScores[i];
}
delete[] examScores;
delete[] examAverages;
delete[] studentAverages;
return 0;
}
我的输入文件包含以下内容:
6 8
Cody Coder 84 100 100 70 100 80 100 65
Harry Houdini 77 68 65 100 96 100 86 100
Harry Potter 100 100 95 91 100 70 71 72
Mad Mulligun 88 96 100 90 93 100 100 100
George Washington 100 72 100 76 82 71 82 98
Abraham Lincoln 93 88 100 100 99 77 76 93
这部分似乎很可疑:
int** examScores = new int* [numStudents];
for (int i = 0; i < numExams; ++i) {
examScores[i] = new int[numExams];
}
数组examScores
有numStudents
个元素,但 for 循环中的上限是numExams
。
此类错误通常可以使用Valgrind工具进行定位。(它在这种情况下有效。看看吧。
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 在c++中使用动态分配的问题
- C++中的动态对象与非动态对象
- 如何在动态数组上使用搜索函数
- 视觉studo 2019中的漫画和静态/动态绑定
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁