【问题标题】:C++ STL list crashes with numbers over 1 000 000 000C++ STL 列表崩溃,数字超过 1 000 000 000
【发布时间】:2012-02-24 15:29:45
【问题描述】:

当我尝试调整列表大小时,程序崩溃...查看该代码,尝试输入 1,000,000,000 (10^9)...在我的 windows 7 x64 上不起作用。

#include <cstdlib>
#include <iostream>
#include <list>

using namespace std;

int main(int argc, char *argv[])
{
    list<long long> l;

    long long n;
    cin>>n;

    cout<<l.max_size()<<endl;

    //uncomment 1 or 2

    //l.resize(n,l.size()+1); //1st try

    /*for (long long i=0; i<n; i++) //2nd try
        l.push_back(n);*/


    //system("PAUSE"); // uncomment if needed
    return 0;
}

最大尺寸超过 4*10^9,但还是不行……我用的是最新的 MinGW (G++)

【问题讨论】:

  • 你认为 10^9 个列表元素消耗了多少内存?即使它是一个简单的双链表,您也有 2 个指针(2 x 8 字节)+ 值(另外 8 个字节)(每个元素全部),这为您提供了大约 24GB 的内存需求。另请注意,实现甚至可能需要的不仅仅是这些 2x8Byte + 每个元素的数据类型大小。
  • 1000000000 * sizeof(long long) 可能比您的计算机可用的 RAM 字节数更多。试试downloading more RAM
  • 为什么会崩溃?你没记忆了?操作系统不必 [实际上,它不允许您的程序拥有 2^64 字节,即使对于 64 位系统也是如此
  • @daknøk:实际上,[通常] 你可以分配更多的内存然后你有 RAM。这就是虚拟内存用于...的原因之一。
  • @daknøk +1 哇,感谢您的链接。我只需点击几下就升级到 16 GB。非常感谢这个链接。

标签: c++ list stl


【解决方案1】:

由于“可用内存”是一个稍微变化无常的概念,l.max_size() 返回一个硬最大值。您的“崩溃”很可能是未捕获的 std::bad_alloc,当内存不足时您会预料到这种情况。

【讨论】:

  • 补充一点,虽然现代操作系统上的进程可能有一个非常大的虚拟内存空间,但这并不意味着操作系统会促进疯狂的分配(在这种情况下显然不是' t)。
  • @jstephenson:没错,但这对于 C++ 实现来说是个问题。如果我提出疯狂但合法的要求,它必须拒绝。这涉及将任何操作系统的疯狂转换为bad_alloc
  • @MSalters 确实,只是想添加一些背景。
猜你喜欢
  • 2010-10-01
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2020-10-14
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多