动态数组的双重释放或损坏

double free or corruption with dynamic arrays

本文关键字:释放 损坏 数组 动态      更新时间:2023-10-16

我今天的问题是动态数组。每次我输入超过 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 .有了这些,您可以轻松地将元素添加到末尾,而无需重新分配自己。