动态数组的双重释放或损坏
double free or corruption with dynamic arrays
我今天的问题是动态数组。每次我输入超过 2 个测试分数时,我在输入第 3 个最大测试分数后都会出现错误,上面写着"* './a.out'中的错误:双重释放或损坏(输出):0x09c2e028 *已中止(核心转储)" 我对阵列做错了吗?还是我痛苦地错过了什么?
该程序应该采用无限数量的测试分数及其各自的最大可能分数(即测试分数 = 76 可能的最大测试分数 = 100),并将这些数字转换为 GPA。我只包括我用来创建 GPA 的类,因为其余代码还没有完成,因为我无法通过这部分。
我必须使用动态数组,因为它用于学校作业。
感谢您的阅读,希望有人可以帮助我!
#include <iostream>
#include <string>
#include <cmath>
#include <math.h>
#include <iomanip>
#include <cassert>
using namespace std;
void programGreeting();
class testScores{
public:
float testAverage(){
int i = 0;
float gpa2 = 0;
int loopCountVar = 0;
int size = 1;
int size2 = 1;
float *testScore = new float[size];
float *maxScore = new float[size];
while(testScore[i] != -1){
i++;
loopCountVar++;
cout << "Enter test score #" << loopCountVar << endl;
cin >> testScore[i];
if(testScore[i] == -1){
size = i;
}
assert(testScore[i] > -2);
cout << "Enter max test score #" << loopCountVar << endl;
cin >> maxScore[i];
if(maxScore[i] == -1){
size2 = i;
}
assert(maxScore[i] > -2);
}
float *gpa = new float[size];
for(i = 1; i < size; i++){
gpa[i] = testScore[i] / maxScore[i];
cout << gpa[i] << " " << endl;
}
for(i = 1; i < size; i++){
gpa2 += gpa[i];
}
for (i = 1; i < size; i++){
cout << endl << testScore[i] << " " << endl;
}
for (i = 1; i < size2; i++){
cout << endl << maxScore[i] << " ";
}
cout << endl << gpa2 << endl;
cin >> size;
delete testScore;
delete [] maxScore;
delete gpa;
return 0;
}
};
所有分配都是new ...[]
的,因此必须delete [] ...
所有删除。
delete [] testScore;
delete [] maxScore;
delete [] gpa;
此外,您的代码只为 testcore 和 maxscore 分配一个元素,但您一直将元素写入数组,直到用户输入 -1。这意味着您很可能会覆盖缓冲区的末尾。
您应该摆脱原始指针并使用 STL 容器,例如 std::vector
.有了这些,您可以轻松地将元素添加到末尾,而无需重新分配自己。
相关文章:
- C++双重释放或损坏(out)
- 使用全局声明的向量时,C++双重释放错误/损坏
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 双重释放或损坏(输出)和中止(核心转储)错误
- 赋值运算符上的双重释放或损坏(out)
- 双重释放或损坏(快速顶部).我该如何解决?
- 双重释放或损坏错误(找不到错误?
- 使用unique_ptr和继承时双重释放或损坏
- 对于我的类函数,我得到双重释放或损坏错误
- 双重释放或损坏(输出):使用向量的组合算法0x0000000001a880a0***
- 如何找到写入释放的内存(堆损坏)?
- OpenMP *** "..."中的错误:双重释放或损坏(快速顶部):[地址] ***
- 动态数组的双重释放或损坏
- 在 wcsncpy 之后释放字符串会导致堆损坏
- 数据结构中的双重释放或损坏
- 错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):
- 在递归函数中释放内存时堆损坏
- 双重释放或损坏(如果重新排序行,则运行正常)
- 双重释放或损坏 (!prev) C++ OpenCV
- C++ 异常的双重释放损坏错误(复制构造函数不起作用)