微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复 C++ 错误:在抛出“std::bad_alloc”实例后调用终止 what(): std::bad_alloc

如何解决如何修复 C++ 错误:在抛出“std::bad_alloc”实例后调用终止 what(): std::bad_alloc

抱歉,我知道这类问题已经在这里有了答案,但我不知道如何将它用于我的代码。 我为一个解决问题的比赛编写了一个程序,它接受一个数组并尝试最大化 |Ax−Ay|+|Ay−Az|+|Az−Ax| 的值。在成对不同的有效索引 (x,y,z) 的所有三元组中。该程序具有以下约束:

  • 1≤t≤5
  • 3≤n≤10^5
  • |Ai|≤10^9 对于每个有效 i

当我尝试运行它时出现以下错误 - “在抛出 'std::bad_alloc' what() 实例后调用终止:std::bad_alloc”。从回答的问题中我能弄清楚的是,我的代码遇到了内存分配问题,但我找不到它在何时何地这样做?也许当它处理大值时?导致错误的原因是什么?

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef vector<ll> vll;
typedef vector<int> vi;

#define rep(i,a,b) for (ll i = a; i < b; i++)
#define repi(i,b) for (ll i = a; i <= b; i++)
#define repn(i,b) for (ll i = a; i >= b; i--)
#define fast()                        \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);                    \
    cout.tie(NULL)
#define all(x) (x).begin(),(x).end()
// solve() function
void solve()
{
    ll n;
    cin >> n;
    vll v(n);
    rep(i,n)
            cin >>
        v[i];
    sort(all(v));
    ll x = v[0],y = v[1],z = v[n - 1];
    ll ans = abs(x - y) + abs(y - z) + abs(z - x);
    cout << ans << endl;
}
// driver function
int main()
{
    fast();
    ll t = 1;
    cin >> t;
    rep(i,t)
    {
        solve();
    }
    return 0;
}

输入格式如下:

Input
The first line of the input contains a single integer T denoting the number of test cases. The description of T test cases follows.
The first line of each test case contains a single integer N.
The second line contains N space-separated integers A1,A2,…,AN.

以下是示例输入:

3
3
2 7 5
3
3 3 3
5
2 2 2 2 5

解决方法

您必须执行以下操作:我不是通过 cin 获取数据,我只是指定值。

void solve()
{
    ll n =100000000; 
    vll v;
    v.reserve(n);
    //omitted
}

它运行良好,并且不会抛出 bad_alloc 错误。在您的情况下, n 可能未初始化,并且未获得有效输入,因此它传递的 n 非常大。当 vll v(n) 尝试分配内存不足时,returns 137 表示内存不足。所以它失败了。如果直接在 n 的构造函数中指定 vector,它将分配更多内存(依赖于编译器)。但是,如果您保留了所需的内存,则它可以正常工作,直到您有足够的内存来保存您放入 vector 的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。