c++中向量的Malloc错误



我是c++的新手,我的编译器给了我一个错误,这对理解问题可能是什么行号没有帮助。

我的代码是Add_1.cpp:
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
vector<int> plusOne(vector<int> &A) {   
    int start=-1;
    for(int i=0;i<A.size()-1;i++)
    {
        if(A[i]>0)
        {
            break;
        }
        if(A[i]==0 && A[i+1]!=0)
        {
            start=i;
            break;          
        }
    }// Truncated Leading 0's
    vector<int> ans(A.size()-start);
    int flag=1;
    for(int i=A.size()-1;i>start;i--)
    {       
        if(A[i]==9)
        {
            if(flag==1)
            {
                ans[i+1]=0;
                flag=1;
            }
            else
            {
                ans[i+1]=A[i];
            }
        }
        else
        {
            ans[i+1]=A[i]+1;
            flag=0;
        }
    }
    for(int i=0; i<ans.size(); i++)
        {
            // cout<<"Here too"<<endl;
            cout<< ans.at(i) <<" ";
        }
    // if(ans[0]==0)
    // {
    //  vector<int> ans1(ans.size()-1);
    //  copy(A.begin()+1,A.end(), ans1.begin());
    //  return ans1;
    // }
    return ans;
}

int main()
{
    vector <int> A ={0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
    vector <int> k (plusOne(A));
    // cout<<ans.size()<<endl;
    for(int i=0; i<k.size(); i++)
        {
            // cout<<"Here too"<<endl;
            cout<< k.at(i) <<" ";
        }
        cout<<endl;
    return 0;
}

当我编译(g++ -std=c++11 Add_1.cpp -o Add)并运行(./Add)时,我抛出了这个错误:

Add: malloc.c:2395: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Aborted (core dumped)

我在这方面读了一些,我所理解的是,这些错误可能是由于错误地使用指针引起的。我仍然不明白这和我的错误有什么关系。

谁能解释一下代码有什么问题,应该如何修复?

代码托管在codepad上。

这段代码的问题语句是:

给定一个以数字数组表示的非负数,该数字加1。此外,这些数字的存储方式是使最高有效位位于列表的开头。

不确定这是你要找的问题,但是…如果我没弄错的话,这是个问题。

声明ans

vector<int> ans(A.size()-start);

即大小为A.size()-startstd::vector

我们知道start可以是-1,也可以是[0, A.size()-2]范围内的值。

考虑start大于零的情况;例如,假设start == 3。在本例中,ans (A.size() - 3)的大小小于A的大小。

下一个循环是

for(int i=A.size()-1;i>start;i--)

所以i的第一个值是A.size() - 1,它的大小大于ans

问题是,在这个循环中,你写在

ans[i+1]

所以你写在ans的范围之外的位置,没有绑定检查。

这会破坏记忆,(我想)可以解释你的问题。

建议:替代

ans[i+1]=0;
//...
ans[i+1]=A[i];
//...
ans[i+1]=A[i]+1;

ans.at(i+1) = 0;
//...
ans.at(i+1) = A[i];
//...
ans.at(i+1) = A[i]+1;

这是因为at()执行绑定检查,在这种情况下,抛出异常。

如果我是对的,你应该用一个异常改变malloc错误。

相关内容

  • 没有找到相关文章

最新更新