在抛出 'std::length_error' what(): basic_string::_S_create 的实例后调用终止
Posted
技术标签:
【中文标题】在抛出 \'std::length_error\' what(): basic_string::_S_create 的实例后调用终止【英文标题】:terminate called after throwing an instance of 'std::length_error' what(): basic_string::_S_create在抛出 'std::length_error' what(): basic_string::_S_create 的实例后调用终止 【发布时间】:2015-09-05 06:56:12 【问题描述】:当编译器处于发布版本时,我收到标题中提到的运行时错误,而在调试版本时出现段错误。我做了一些研究,我发现这是因为我传递字符串以添加方法的方式。我不清楚,所以如果有人用简单的语言描述为什么会发生运行时错误,那将很有帮助。
#include <bits/stdc++.h>
using namespace std;
string add(string a,string b)
int lena=a.size()-1,lenb=b.size()-1,carry=0,t;
//segfault occurs here
string tmp;
int m,n;
while(lena>=0||lenb>=0)
m=0;
n=0;
if(lena>=0)
m=a[lena]-'0';
lena--;
if(lenb>=0)
n=b[lenb]-'0';
lenb--;
t=m+n+carry;
if(t>9)
carry=1;
else
carry=0;
tmp.push_back('0'+t%10);
if(carry)
tmp.push_back('1');
reverse(tmp.begin(),tmp.end());
return tmp;
class Solution
public:
string multiply(string A,string B);
;
string Solution::multiply(string A,string B)
int i=A.size()-1,j=0,szb=B.size(),c=0,m=0,k=0,n=0;
string sum="",tmp="";
while(i>=0)
tmp.clear();
j=szb-1;
k=n;
while(k--)
tmp.push_back('0');
n++;
c=0;
while(j>=0)
m=(A[i]-'0')*(B[j]-'0')+c;
c=m/10;
tmp.push_back((m%10)+'0');
j--;
if(c)
tmp.push_back(c+'0');
reverse(tmp.begin(),tmp.end());
sum=add(sum,tmp);
i--;
string ans;
for(i=0,j=sum.size();i<j;i++)
if(sum[i]!='0')
while(i<j)
ans.push_back(sum[i]);
i++;
if(ans.size()==0)
return "0";
int main()
Solution ob;
string s;
s=ob.multiply("99999","99999");
cout<<s<<endl;
【问题讨论】:
【参考方案1】:该错误与您将字符串传递给 add 函数的方式无关。我不确定你从哪里得到这个想法。错误在这里
if(ans.size()==0)
return "0";
应该说
if (ans.size() == 0)
return "0";
else
return ans;
问题是如果ans.size() > 0
那么你没有返回任何东西,但是你的函数承诺返回一个字符串。这会导致运行时崩溃。
当我在我的编译器上尝试你的代码时,它给了我一个警告
警告 C4715:“Solution::multiply”:并非所有控制路径都返回值
这正是我所说的,您并不总是从multiply
返回值。您的编译器可能会说类似的话,您应该始终注意编译器警告消息。它们通常确实表明您的代码有问题。
【讨论】:
谢谢约翰。当我用同样的错误搜索 SO 时,我猜错了。可能是他们的那些案例与我的不同,我误解了。我正在使用代码块 13.12,当我每次在帖子中提到的第 no 行发生段错误时尝试逐行调试时。你能解释一下为什么吗? @FarsanRashid 我无法解释。对我来说,将multiply
的结果分配给变量s
时,错误发生在s=ob.multiply("99999","99999");
行。这就是我对您所犯错误的期望。
你用的是哪个 IDE?
Visual Studio 2013。您可能有另一个我没有发现的错误。以上是关于在抛出 'std::length_error' what(): basic_string::_S_create 的实例后调用终止的主要内容,如果未能解决你的问题,请参考以下文章
关于在抛出 'std::length_error' 实例后调用终止
在抛出 'std::length_error' what(): basic_string::_S_create 的实例后调用终止
c++ 中的错误:“在抛出 'std::length_error'what() 的实例后调用终止:basic_string::_M_replace_aux”
理解错误“在抛出 'std::length_error'what() 实例后调用终止:basic_string::_S_create Aborted (core dumped)”
抛出“std::length_error”实例后调用 C++ 终止,what(): basic_string::_M_create