C++ 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值
我试图解决Leetcode问题746,这是一个基本的动态规划问题。尽管我的逻辑有点复杂,但它应该工作得很好。我有两个不眠之夜试图找出我的代码中的问题是什么。有人能准确指出我在哪里进行堆溢出以及如何避免它吗 另外,我忘了加上,成本的大小总是大于3 我已经尝试在解决方案中插入注释。我意识到问题在于更新代码的成本[1],但问题是什么,我不知道C++ 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值,c++,c++11,c++17,C++,C++11,C++17,我试图解决Leetcode问题746,这是一个基本的动态规划问题。尽管我的逻辑有点复杂,但它应该工作得很好。我有两个不眠之夜试图找出我的代码中的问题是什么。有人能准确指出我在哪里进行堆溢出以及如何避免它吗 另外,我忘了加上,成本的大小总是大于3 我已经尝试在解决方案中插入注释。我意识到问题在于更新代码的成本[1],但问题是什么,我不知道 class Solution { public: int minCostClimbingStairs(vector<int>& co
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
if(cost.size() < 3)
return 0;
int costing[2];
costing[0]=cost[0];
costing[1]=cost[1];
int i=1;
while(i<cost.size()-2)
{
if(costing[0]+cost[i]>costing[0]+cost[i+1])
{
costing[0]=costing[0]+cost[i+1];
i++;
}
else if (costing[0]+cost[i]<=costing[0]+cost[i+1])
{
costing[0]=costing[0]+cost[i];
i+=2;
}
if(costing[1]+cost[i+1]>=costing[1]+cost[i+2])
{
cout<<costing[1]+cost[i+1]<<"is greater than " <<costing[1]+cost[i+2]<<"\n";
costing[1]+=cost[i+2];
i+=2;
}
else if (costing[1]+cost[i+1]<costing[1]+cost[i+2])
{
cout<<costing[1]+cost[i+1]<<"is less than " <<costing[1]+cost[i+2]<<"\n";
costing[1]+=cost[i+1];
i++;
}
}
return min(costing[0],costing[1]);
}
};
类解决方案{
公众:
int最小成本攀爬台(向量和成本){
如果(成本大小()<3)
返回0;
国际成本计算[2];
成本[0]=成本[0];
成本[1]=成本[1];
int i=1;
而(icosting[0]+成本[i+1])
{
成本计算[0]=成本计算[0]+成本[i+1];
i++;
}
else if(成本[0]+成本[i]=成本[1]+成本[i+2])
{
难道不是堆没有足够的空间吗?向量在堆上分配连续的内存块。如果向量长时间增长,堆可能会变得碎片化。因此,在某个点上没有可用的块
也许使用可以帮助你防止这种行为
还请记住,对向量的索引访问()不包括与函数相反的范围检查。i
的初始值为1。在不同条件下(如果第一个否则如果和第二个如果为真),它可以在的一次迭代中增加4
因此,在的第二次迭代中,i
的值可以变成9
因此,在最后一个else if
,成本[i+2]
是成本[11]
。因为您的数据集只有10个元素(如注释中所述),这会导致越界访问。刚刚编辑了这个问题。成本大小始终大于3。您是否尝试在程序运行时输出一些i
值?在我看来,错误似乎不会在一开始就发生。Ifi
在第一个If()
或else If()中递增
第二个if()
或else if()
在edge case中可以越界访问。@Wolf是的。它运行了一半时间,但完全正常,然后停止运行,并给出地址消毒器错误。@Sma否,不会出现异常。某些运行时范围检查调试版本中的向量索引,但不检查数组。如果需要检查,请使用向量及其at
函数而不是indexing.先生,你应该得到一块饼干。非常感谢你的输入。是的。我意识到你所说的可能会发生。我仍然不确定如何更改我的代码,因为这两种逻辑的while循环似乎太多了。但至少现在我知道了问题所在。非常感谢:)谢谢你帮助我理解堆溢出低与内存不足不同,即。