第一个代码中的错误,但第二个正确“在抛出 '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 &lt; 26 &amp;&amp; n &gt; -26 时,除法将返回 0。当您在循环结束时减去 1 时,n 将始终为 -1:-1/26 = 00 - 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 ++]

将字母向前移动 3 个字母的程序,错误:在抛出 'std::out_of_range' 的实例后调用终止