有限的分配大小 C++

发布于 2024-12-20 16:02:49 字数 229 浏览 0 评论 0原文

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

unsigned int *big_massive = new unsigned int[1073741824]

但是,当我尝试调试该程序时,出现以下错误:无效的分配大小:4294967295 字节。 我希望有什么办法可以避免这样的错误?谢谢你!

I use Visual Studio 2008.
I have dynamically declared the variable big_massive:

unsigned int *big_massive = new unsigned int[1073741824]

But, when I tried to debug this program, I got following error: Invalid allocation size: 4294967295 bytes.
I hope there are any path to avoid such error? Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

混浊又暗下来 2024-12-27 16:02:49

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

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

That allocation is simply not possible on 32bit x86 systems with sizeof(int)==4 (you are requesting 4GB). A process's total address space is limited to 4GB, and the process itself is usually limited to less than that (2GB or 3GB for 32bit Windows depending on boot.ini settings and the Windows edition, not sure which limit applies for 32bit processes on 64bit Windows, but 4GB is simply not possible).

For the 64bit case, you'd need to have 4GB of virtual memory available to back that allocation for it to succeed.

橙味迷妹 2024-12-27 16:02:49

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

Amount of virtual memory per process on 32bit Windows system or 64bit Windows system running a 32bit program (WoW64): 2147483648
Amount of memory needed to hold an array of 1073741824 4-byte unsigned integers: 4294967296
Can't possibly fit in the amount of memory available, so it's an invalid allocation.

太阳男子 2024-12-27 16:02:49
  • 32 位系统每个进程不能访问超过 4GB 的内存。然而,在支持延迟分配和过度使用的操作系统上分配 3GB 内存就很好了,即使您只使用前 10kB,而且您的最大交换+内存无论如何都是 1GB。但请记住,依赖这一点首先是愚蠢的。
  • 在尝试使用那么多内存之前,请检查是否无法以更紧凑的形式表示数据。如果您的数组有漏洞,或者值重复,或者您不使用 int 的完整 32 位范围,或者您不需要这些值具有特定的顺序,则不要使用数组。
  • 请记住 RAM 用于临时数据。如果您的数据需要写入磁盘,为什么不首先使用磁盘空间呢?您甚至可以使用内存映射文件(您选择文件的一部分,然后可以像访问内存一样访问它)。您可能还喜欢数据库管理系统的(更简单或更简单的)替代方案。
  • A 32 bit system cannot access more than 4GB of memory per process. However, allocating 3GB of memory is fine on OS supporting lazy allocation and overcommiting, even if you only use the first 10kB, and your maximum swap+memory is 1GB anyway. But keep in mind that relying on this is stupid in the first place.
  • Before trying to use that much memory, check if you can't represent your data in a more compact form. If your array has holes, or values are repeated, or you don't use the full 32bit range of your int, or you don't need those values to have a specific order, just do not use an array.
  • Remember RAM is for temporary data. If your data need to be written on disk, why don't you use disk space in the first place. You might even use memory-mapped files (you select a part of your file, and you can access it like memory). You might also like the (easier or not) alternatives of databases management systems.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文