【问题标题】:Why do I receive a std::bad_alloc exception when running this code?为什么在运行此代码时会收到 std::bad_alloc 异常?
【发布时间】:2017-02-08 00:53:23
【问题描述】:

当我运行下面的代码时,我收到如下错误:

在抛出 'std::bad_alloc' 实例后调用终止
什么():std::bad_alloc

此应用程序已请求运行时终止它 不寻常的方式。请联系应用程序的支持团队了解更多信息 信息。

我认为这可能是由“resize()”行引起的,但我不知道如何修复它。这是我的代码:

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;

long long n, l, r;
string x[3];

int main()
{
    ios::sync_with_stdio(false);
    for (int i = 0; i <= 2; i++)
        x[i].resize(x[i].max_size());
    x[0] = '0';
    x[1] = '1';
    cin >> n >> l >> r;
    for (register long long i = 2; i <= n ; i++)
        x[i % 3] = x[(i - 2) % 3] + x[(i - 1) % 3];
    cout << x[n % 3].substr(l, r - l + 1) << endl;
    return 0;
}

【问题讨论】:

  • 不要将你的字符串调整得这么大。您是否尝试打印出您尝试调整大小的尺寸?
  • 您实际上根本不需要调整它们的大小。 c = a + b 会自动在c 中分配足够的存储空间。
  • 也许看看documentation of std::string::max_size。提供的示例(您的实现可能不同)很好地说明了您可能不必要地尝试分配多少内存。在您的情况下,您真的需要跨三个字符串的 6gB 空间来执行任何操作吗?
  • @godwing:如果您的程序是 Windows 32 位,那么您只为这两个字符串使用了 200.001% 的计算机内存。
  • 我不认为你理解。您正在尝试使用 2 十亿 字节长度的字符串。其中三个。

标签: c++ bad-alloc


【解决方案1】:

std::string::max_size() 可能是一个很大的数字,例如SIZE_MAX,例如32 位系统上 4 GB 或 64 位系统上的平方。所以你的程序内存不足。

您的程序甚至不需要该分配,因为您立即用单字符串覆盖了前 2 个字符串!也许你想的是reserve而不是resize,但即便如此,你也可以保留比max_size少得多的金额。

注意。 register 已弃用,将在 C++17 中删除。

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 2023-03-10
    • 2013-11-08
    • 2012-12-22
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多