c ++双重免费或损坏(out)错误

时间:2016-03-25 04:23:12

标签: c++ memory-management double free corruption

打印输出后,我收到“Double free or 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 个答案:

答案 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的簿记数据。

当你有更大的分配时,新内存不能完全适合堆的可用空间,因此分配器最终会在分配之间留下一些空间。因此,小的溢出不会破坏堆信息。