我在 c++ 程序中遇到bad_alloc错误

I am getting bad_alloc error in c++ program

提问人:rgv 提问时间:1/6/2021 最后编辑:François Andrieuxrgv 更新时间:1/6/2021 访问量:580

问:

我编写了一个 c++ 程序,但出现错误。 我不明白我收到错误的原因。 请帮助我如何解决这个问题。

这是我的代码:

#include <bits/stdc++.h>
#define endl "\n"
#define int long long
using namespace std;

void solve() {
    int n, x;
    cin >> n >> x;
    cout << n << x;
    vector <int> in(n);
    for (auto &p : in)
        cin >> p;

    vector<int> vect;
    vect = in;

    int cnt = 0;
    int l = n;
    for (int i = 0; i < l; i++) {
        if (vect[i] % 2 == 0) {
            while (x--) {
                vect.push_back(vect[i] / 2);
                l++;
            }
        }
        else {
            cnt = i;
            break;
        }
    }
    int sum = 0;
    for (int i = 0; i < cnt; i++) {
        sum += vect[i];
    }
    cout << sum << endl;
}


signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

输入为:

2 1 2 12 4 2 4 6 8 2 

这是我在用崇高的文字编译它时遇到的错误:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
[Finished in 4.0s]
C++ 错误处理 dynamic-memory-allocation bad-alloc alloc

评论

5赞 François Andrieux 1/6/2021
#define endl "\n"并且如果包含任何标准标头,则不允许在 C++ 中使用。#define int long long
3赞 François Andrieux 1/6/2021
请阅读为什么我不应该 #include < bits/stdc++.h>?为什么“using namespace std;”被认为是不好的做法?
1赞 rgv 1/6/2021
这是我给出的输入: 2 1 2 12 4 2 4 6 8 2 我更改了头文件,但仍然收到相同的错误。
1赞 drescherjm 1/6/2021
错误可能在这里:您应该始终在使用输入之前验证输入。 可能是垃圾值或非法值。vector <int> in(n);n
2赞 PaulMcKenzie 1/6/2021
#define int long long--没有必要这种可怕的东西。C++ 中有一个类型,意味着要再输入 4 个字符来完整描述类型和类型所包含的位数。int64_t

答:

3赞 john 1/6/2021 #1

问题出在变量的处理上。不要问我解决方案是什么,但我可以描述问题。x

        while (x--) {
            vect.push_back(vect[i] / 2);
            l++;
        }

此循环的第一次运行等于 2。因此,将两个项目添加到向量中并取值 。xx-1

下次运行此循环时从 开始,因此循环会一直运行,直到内存不足并出现异常。x-1bad_alloc

评论

0赞 François Andrieux 1/6/2021
解决方案似乎是在循环之前复制并使用复制。也许将循环转换为初始化其迭代变量的循环会更清晰。xwhileforx
1赞 rgv 1/6/2021
@FrançoisAndrieux是的,使用 for 循环会更好,错误是由于 while(x--)。
0赞 Peter 1/6/2021
更不用说循环递增的事实了。 是包含循环中的上限。whilelli