C ++中向量的Malloc错误
Malloc error on vectors in C++
我是 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 上。
这段代码的问题陈述是:
给定一个以数字数组表示的非负数,将数字加一。此外,数字的存储方式是将最重要的数字放在列表的开头。
不确定这是否是您要查找的问题,但是...如果我没看错,那就是问题。
您声明 ans
为
vector<int> ans(A.size()-start);
这是 std::vector
大小 A.size()-start
。
我们知道 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 错误。
我是 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 上。
这段代码的问题陈述是:
给定一个以数字数组表示的非负数,将数字加一。此外,数字的存储方式是将最重要的数字放在列表的开头。
不确定这是否是您要查找的问题,但是...如果我没看错,那就是问题。
您声明 ans
为
vector<int> ans(A.size()-start);
这是 std::vector
大小 A.size()-start
。
我们知道 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 错误。