C++ 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值

C++ 为什么我的程序一直给我堆缓冲区溢出,即使我没有超出数组的界限或覆盖任何值,c++,c++11,c++17,C++,C++11,C++17,我试图解决Leetcode问题746,这是一个基本的动态规划问题。尽管我的逻辑有点复杂,但它应该工作得很好。我有两个不眠之夜试图找出我的代码中的问题是什么。有人能准确指出我在哪里进行堆溢出以及如何避免它吗 另外,我忘了加上,成本的大小总是大于3 我已经尝试在解决方案中插入注释。我意识到问题在于更新代码的成本[1],但问题是什么,我不知道 class Solution { public: int minCostClimbingStairs(vector<int>& co

我试图解决Leetcode问题746,这是一个基本的动态规划问题。尽管我的逻辑有点复杂,但它应该工作得很好。我有两个不眠之夜试图找出我的代码中的问题是什么。有人能准确指出我在哪里进行堆溢出以及如何避免它吗

另外,我忘了加上,成本的大小总是大于3

我已经尝试在解决方案中插入注释。我意识到问题在于更新代码的成本[1],但问题是什么,我不知道

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
值?在我看来,错误似乎不会在一开始就发生。If
i
在第一个
If()
else If()中递增
第二个
if()
else if()
在edge case中可以越界访问。@Wolf是的。它运行了一半时间,但完全正常,然后停止运行,并给出地址消毒器错误。@Sma否,不会出现异常。某些运行时范围检查调试版本中的向量索引,但不检查数组。如果需要检查,请使用向量及其
at
函数而不是indexing.先生,你应该得到一块饼干。非常感谢你的输入。是的。我意识到你所说的可能会发生。我仍然不确定如何更改我的代码,因为这两种逻辑的while循环似乎太多了。但至少现在我知道了问题所在。非常感谢:)谢谢你帮助我理解堆溢出低与内存不足不同,即。