【问题标题】:The limited allocation size C++有限的分配大小 C++
【发布时间】:2011-12-10 09:45:59
【问题描述】:

我使用 Visual Studio 2008。 我已经动态声明了变量 big_massive:

unsigned int *big_massive = new unsigned int[1073741824]

但是,当我尝试调试这个程序时,我得到了以下错误:Invalid allocation size: 4294967295 bytes. 我希望有什么方法可以避免这种错误?谢谢!

【问题讨论】:

  • 32 位 Visual Studio 项目。但在 64 位项目中,我收到错误“test.exe 中 0x000007fefd74cacd 处的未处理异常:Microsoft C++ 异常:内存位置 0x002ef8b8 处的 std::bad_alloc ..”我的操作系统 - Windows 7 x64
  • 32 位系统无法分配那么多内存,这会占用系统可用的所有内存。

标签: c++ dynamic allocation


【解决方案1】:

在带有sizeof(int)==4 的 32 位 x86 系统上根本不可能进行这种分配(您请求的是 4GB)。进程的总地址空间限制为 4GB,进程本身通常限制为小于 32 位 Windows 的 2GB 或 3GB,具体取决于boot.ini 设置和 Windows 版本,不确定哪个限制适用于 64 位 Windows 上的 32 位进程,但 4GB 根本不可能)。

对于 64 位的情况,您需要有 4GB 的可用虚拟内存来支持该分配才能成功。

【讨论】:

    【解决方案2】:

    运行 32 位程序 (WoW64) 的 32 位 Windows 系统或 64 位 Windows 系统上每个进程的虚拟内存量:2147483648 保存 1073741824 个 4 字节无符号整数数组所需的内存量:4294967296 可能无法容纳可用的内存量,因此分配无效。

    【讨论】:

      【解决方案3】:
      • 32 位系统每个进程不能访问超过 4GB 的内存。但是,在支持延迟分配和过度使用的操作系统上分配 3GB 内存是可以的,即使您只使用前 10kB,而且您的最大交换+内存无论如何都是 1GB。但请记住,一开始就依赖它是愚蠢的。
      • 在尝试使用这么多内存之前,请检查您是否无法以更紧凑的形式表示数据。如果您的数组有漏洞,或者值重复,或者您没有使用完整的 32 位整数范围,或者您不需要这些值具有特定顺序,请不要使用数组。
      • 记住 RAM 是用于临时数据的。如果您的数据需要写入磁盘,为什么不首先使用磁盘空间。您甚至可以使用内存映射文件(您选择文件的一部分,并且可以像访问内存一样访问它)。您可能还喜欢数据库管理系统(无论是否简单)的替代方案。

      【讨论】:

        猜你喜欢
        • 2018-06-29
        • 1970-01-01
        • 2014-08-21
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-12
        相关资源
        最近更新 更多