Ошибка свободной памяти динамического массива: _BLOCK_TYPE_IS_VALID

Я пытаюсь освободить динамическую память, но получаю ошибку. Мне нужна помощь, чтобы указать, какая часть моего кода вызывает ошибку.

У меня есть деструктор, чтобы освободить два динамических массива. Удаляя деструктор я получаю не ошибки.

Ошибка: _BLOCK_TYPE_IS_VALID (pHEAD-> nBlockUse)

Счета класс:

class Scores
{
private:
int numOfTest;
double *scoresArray = nullptr;
double scoreAvg;
double *scoreSort = nullptr;
public:
Scores(int);
~Scores();
void setNumOfTest();
int getNumOFTest();
void setScores();
double* getScores();
void setSort();
double* getSort();
void setScoreAvg();
double getScoreAvg();
};

Scores::Scores(int num)
{
scoresArray = new double [num];
scoreSort = new double[num];
numOfTest = num;
}

Scores::~Scores()
{
delete [] scoresArray;
delete [] scoreSort;
scoresArray = nullptr;
scoreSort = nullptr;
}void Scores::setNumOfTest()
{
// Verify number of test scores is positive
while (numOfTest <= 0)
{
cout << "The number of test need to be postive." << endl;
cout << "Enter another number: ";
cin >> numOfTest;
}
}

int Scores::getNumOFTest()
{
return numOfTest;
}

void Scores::setScores()
{
double scores;
int size = getNumOFTest();
//scoresArray = new double[size];

for (int i = 0; i < numOfTest; i++)
{
cout << "Enter test score " << i + 1 << ": ";
cin >> scores;

// Verify if score enter is positive
while (scores < 0)
{
cout << "Negative scores are not allowed." << endl;
cout << "Enter another score for this test: ";
cin >> scores;
}

scoresArray[i] = scores;
}
}

double* Scores::getScores()
{
//double *sa = scoresArray;
//return sa;
return scoresArray;
}

void Scores::setSort()
{
int size = getNumOFTest();
//scoreSort = new double[size];
scoreSort = getScores();

for (int i = 0; i < size; i++)
{
int smallPos = i;
double smallest = scoreSort[smallPos];

for (int j = i + 1; j < size; j++)
{
if (scoreSort[j] < scoreSort[smallPos])
{
smallPos = j;
smallest = scoreSort[smallPos];
}
}

scoreSort[smallPos] = scoreSort[i];
scoreSort[i] = smallest;
}
}

double* Scores::getSort()
{
//double *ss = scoreSort;
//return ss;
return scoreSort;
}

void Scores::setScoreAvg()
{
int size = getNumOFTest();

for (int i = 0; i < size; i++)
{
scoreAvg += scoresArray[i];
}

scoreAvg /= size;
}

double Scores::getScoreAvg()
{
return scoreAvg;
}

Главный:

int main()
{
int numOfTest;

cout << "How many test scores will you enter" << endl;
cin >> numOfTest;

Scores s(numOfTest);

s.setNumOfTest();
s.setScores();
s.setSort();
s.setScoreAvg();

double y = s.getScoreAvg();
double *x = nullptr;
x = new double[numOfTest];
x = s.getSort();

cout << "sort" << endl;
for (int i = 0; i < numOfTest; i++)
{
cout << x[i] << "\n";
}

cout << "avg" << endl;
cout << y;
delete[] x;
x = nullptr;
//s.Scores1();

return 0;
}

0

Решение

То, что вы видите, это двойное удаление. Одна очевидная проблема заключается в том, что вы получаете указатель на объект sдинамически распределяемый массив scoresArray Вот:

x = s.getSort(); // also leaks memory previously pointed at by x

тогда вы звоните delete[] в теме:

delete[] x; // calls delete[] on s.scoresArray

Но s объект также вызывает delete[] на это в своем деструкторе. Это приведет к двойному удалению.

Там могут быть другие ошибки в коде, кроме этого.

Обратите внимание, что вы могли бы тривиально избежать этой проблемы, не используя динамическое распределение явно, но полагаясь на такие типы, как std::vector<double> вместо.

1

Другие решения

Проблема в том, что эта строка в Scores::setSort:

scoreSort = getScores();

getScores() возвращается scoresArray, А сейчас scoreSort а также scoresArray указать на тот же динамически выделенный блок. Когда вы затем пытаетесь удалить их обоих, вы удаляете один и тот же блок дважды.

Вместо того, чтобы назначать указатели, вы должны скопировать содержимое scoresArray в scoreSortзатем сортировать scoreSort,

0

По вопросам рекламы [email protected]