ошибка 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;
}
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