C++的有限分配大小问题

3
我使用的是Visual Studio 2008。 我动态声明了变量big_massive:
unsigned int *big_massive = new unsigned int[1073741824]

但是,当我尝试调试这个程序时,我收到了以下错误提示:无效的分配大小:4294967295字节。 我希望有任何方法可以避免这种错误?谢谢!


1
32位的Visual Studio项目。但在64位的项目中,我得到了错误消息“在0x000007fefd74cacd处未处理的异常情况: Microsoft C++ 异常: std::bad_alloc 在内存位置0x002ef8b8。” 附言:我的操作系统是Windows 7 x64。 - Girl_Developer
1
一个32位系统无法分配那么多内存,否则会占用系统所有可用的内存。 - Seth Carnegie
3个回答

6
在32位x86系统中,如果sizeof(int)==4(即您正在请求4GB),则不可能分配该内存。一个进程的总地址空间被限制为4GB,而进程本身通常被限制在小于4GB的大小(对于32位Windows,取决于boot.ini设置和Windows版本,通常为2GB或3GB;我不确定在64位Windows上适用哪个限制于32位进程,但4GB是不可能的)。在64位情况下,您需要有4GB虚拟内存可用来支持该分配才能成功。

3

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


2
  • 32位系统每个进程最多只能访问4GB的内存。但是,在支持惰性分配和超额提交的操作系统上,分配3GB的内存是可以的,即使您只使用了前10kB,并且您的最大交换+内存也只有1GB。但请记住,首先依赖这一点是愚蠢的。
  • 在尝试使用那么多内存之前,请检查是否可以以更紧凑的形式表示数据。如果您的数组有空洞,或值重复,或您不使用int的完整32位范围,或者您不需要这些值具有特定顺序,请不要使用数组。
  • 记住RAM是用于临时数据的。如果您的数据需要写入磁盘,为什么不首先使用磁盘空间呢?您甚至可以使用内存映射文件(选择文件的一部分,然后可以像内存一样访问它)。您可能还喜欢数据库管理系统的(更简单或不太简单的)替代方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接