c++双重释放或损坏(out)错误

c++ double free or corruption (out) error

本文关键字:out 错误 损坏 释放 c++      更新时间:2023-10-16

打印输出后,出现"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;
}

我认为问题的根源是由valueArray的分配以及迭代超出界限的事实引起的。

valueArray=new int[value];用大小为value的数组初始化valueArray,该数组是未初始化的变量。也许你打算用noItems

此外,正如宋元耀在评论中指出的,您的for循环看起来像for(int i=1;i<=noItems;i++),它在1开始计数器,在noItems结束计数器,这是错误的。在包括C++在内的许多语言中,数组从索引0开始(意味着第一个项目是array[0],而不是array[1]),最后一个项目是1减去数组的大小(因此具有5个元素的数组的最后一个项是array[4])。

如果您将for循环更改为从0开始,并在noItems之前结束一个元素,那么您应该是金色的。那将是for(int i = 0; i < noItems; i++ )

较小的分配可能会导致不同的内存块按顺序排列在内存堆的同一区域,因此当数据溢出缓冲区时,就会破坏new的记账数据。

当您有更大的分配时,新内存无法干净地放入堆的可用空间,因此分配器最终会在分配之间留下一些空闲空间。因此,一个小的溢出不会破坏堆信息。

相关文章: