c++双重释放或损坏(out)错误
c++ double free or corruption (out) error
打印输出后,出现"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
的记账数据。
当您有更大的分配时,新内存无法干净地放入堆的可用空间,因此分配器最终会在分配之间留下一些空闲空间。因此,一个小的溢出不会破坏堆信息。
相关文章:
- 解决方案在第 25 行执行错误'out of bounds'
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- 运行编译的 a.out 后出现分段错误(核心转储)错误
- 从 MSVC14 切换到 MSVC16 会导致"compiler is out of heap space (C1060)"错误
- -bash:/a.out:无法执行二进制文件:Exec格式错误
- 如何解决'vector subscript out of range'错误?
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 尝试获取矩阵的正确对角线会导致"vector out of range"错误
- 使用 top() 时收到错误"cannot dereference out of range deque iterator"
- 尝试解决"out of scope"编译错误:CodeBlocks,Linux Fedora
- 有什么方法可以修复 CLion 中使用 SFML 的程序"command timed out" GDB 错误?
- 使用矢量"String subscript out of range"错误
- GLSL 错误:"out"限定符仅对 GLSL 1.10 中的函数参数有效
- 我收到"vector subscript out of range"错误
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 这里有一个错误:"string subscript is out of range"
- 每次调试此代码时,我都会得到"subscript out of range error"。有人可以帮我查明一个或多个错误吗?
- 字符指针指向字符串,然后指向字符串数组。"./a.out"中的错误:malloc():内存损坏:0x0900c3b0***
- 如何在中等规模的项目中诊断g ++错误"cc1plus.exe: out of memory allocating 838860800 bytes"?
- 什么可能导致错误:"Fatal Error: Out of memory - aborting"简单地包含头文件?