ошибка c++ double free или corruption (out)



Я получаю ошибку "Double free или corruption (out)" после того, как я печатаю свой вывод. Но эта ошибка возникает только для небольших входов. Для больших входных данных программа не выдает эту ошибку. Когда я создаю многомерные массивы внутри main и удаляю их, я не получаю ошибку. Я опубликовал здесь только ту часть кода, которая имеет отношение к этому вопросу. Пожалуйста, объясните, как решить эту проблему.



#include<iostream>
#include<vector>
using namespace std;

class Knapsack{
public:
int noItems, capacity, value, weight;
int *weightArray, *valueArray;
int **ValueMatrix, **BacktrackMatrix;
vector<int> itemsChosen;
~Knapsack();
void getInputs(); // reads in data
void findItems(); // calculates best value of items
void backTrack(int row, int col); // backtracks items selected
void print(); //prints out data
};

Knapsack::~Knapsack()
{
delete[] weightArray;
delete[] valueArray;
for(int i=1;i<=noItems;i++)
{
delete[] ValueMatrix[i];
}
delete[] ValueMatrix;
for(int i=1;i<=noItems;i++)
{
delete[] BacktrackMatrix[i];
}
delete[] BacktrackMatrix;
}

void Knapsack::getInputs()
{
cin>>noItems;
cin>>capacity;
weightArray=new int[noItems];
valueArray=new int[value];
for(int i=1;i<=noItems;i++)
{
cin>>value;
valueArray[i]=value;
}
for(int i=1;i<=noItems;i++)
{
cin>>weight;
weightArray[i]=weight;
}
ValueMatrix=new int*[noItems];
for(int i=1;i<=noItems;i++)
{
ValueMatrix[i]=new int[capacity+1];
}
BacktrackMatrix=new int*[noItems];
for(int i=1;i<=noItems;i++)
{
BacktrackMatrix[i]=new int[capacity+1];
}
}

int main()
{
Knapsack *knap=new Knapsack();
knap->getInputs();
knap->findItems();
knap->print();
delete knap;
return 0;
}
2082   1  

1 ответ:

Я полагаю, что корень вашей проблемы вызван распределением valueArray и тем фактом, что вы выходите за пределы итерации.

Строка valueArray=new int[value]; инициализирует valueArray массивом размера value, который является неинициализированной переменной. Возможно, вы хотели использовать noItems?

Также, как указал сонгюаньяо в комментариях, ваши for циклы выглядят как for(int i=1;i<=noItems;i++), который начинает счетчик в 1 и заканчивается счетчиком в noItems, что является ошибочным. Во многих языках, включая C++ , массивы начинаются с индекса 0 (то есть первый элемент - array[0], а не array[1]), а последний элемент-единица минус размер массива (таким образом, последний элемент массива с 5 элементами - array[4]).

Если вы измените свой цикл for, чтобы начать с 0 и закончить один элемент перед noItems, Вы должны быть золотыми. Это будет for(int i = 0; i < noItems; i++ )

Что, вероятно, происходит с меньшими выделениями, так это то, что различные куски памяти расположены последовательно в одной и той же области кучи памяти, поэтому, когда вы переполняя буфер данными, вы разбиваете бухгалтерские данные new.

Когда у вас есть большие выделения, новая память не может поместиться так же чисто в свободное пространство кучи, поэтому распределитель в конечном итоге оставляет некоторое свободное пространство между выделениями. Таким образом, небольшой перерасход не уничтожает кучу информации.

Comments

    Ничего не найдено.