第一个代码中的错误,但第二个正确“在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc Aborted(core dumped)”
Posted
技术标签:
【中文标题】第一个代码中的错误,但第二个正确“在抛出 \'std::bad_alloc\' what() 的实例后调用终止:std::bad_alloc Aborted(core dumped)”【英文标题】:error in 1st code but 2nd one correct "terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted(core dumped)"第一个代码中的错误,但第二个正确“在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc Aborted(core dumped)” 【发布时间】:2018-05-29 19:01:45 【问题描述】:我的代码在第一个代码中给出了错误,但第二个代码运行时没有任何错误“在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc Aborted (core dumped)” //第一个
#include<bits/stdc++.h>
using namespace std;
int main()
//code
int t;
cin>>t;
while(t--)
int n;
cin>>n;
string res;
while(n)
res.push_back((n%26) + 'A');
n=n/26;
n-=1;
reverse(res.begin(),res.end());
cout<<res<<endl;
return 0;
第二个代码如下,没有错误,谁能告诉我为什么会出现这个错误
while(n)
n-=1;
res.push_back((n%26) + 'A');
n=n/26;
【问题讨论】:
如果n=n/26
永远等于 0 会怎样?在第一种情况下,n-=1
将产生一个负值。
无关:避免使用来自bits
的任何包含。它们是仅供库实现使用的内部头文件。这个特殊的头文件 stdc++.h 可能是一个特别糟糕的禁忌。更多信息在这里:Why should I not #include <bits/stdc++.h>?
【参考方案1】:
第一个例子的问题是
while(n)
res.push_back((n%26) + 'A');
n=n/26;
n-=1;
会变成无限循环。为什么?因为n/26
是整数除法。这意味着当n < 26 && n > -26
时,除法将返回 0。当您在循环结束时减去 1 时,n 将始终为 -1:-1/26 = 0
和 0 - 1 = -1
。因此,您的字符串会变得太大,这就是导致std::bad_alloc
的原因。
第二个版本工作得很好,因为你在除以 26 之前减去一个,这意味着循环以 n=0
开始时会有一个点
【讨论】:
以上是关于第一个代码中的错误,但第二个正确“在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc Aborted(core dumped)”的主要内容,如果未能解决你的问题,请参考以下文章
c++ 中的错误:“在抛出 'std::length_error'what() 的实例后调用终止:basic_string::_M_replace_aux”
在抛出 'std::length_error' 的实例后调用终止
我收到以下错误:在抛出 'std::bad_alloc' 的实例后调用终止
在抛出 'std::system_error 的实例后调用终止
多个文件的内存分配错误“在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用” [C ++]