3

我有一个 C++ 应用程序,它在运行时生成原始位图图像并将它们推送到临时 std::vector 中,在每次写入时动态分配内存,然后用于在程序存在之前将这些图像写入文件。当前位图大小为 1280x720 . 在第 650 帧 +- 3 帧后出现“错误分配”错误。我很清楚,这是因为 RAM 内存不足。那是因为如果我缩小尺寸(比如说 300x200),我设法存储所有 950 帧 ok。这很奇怪,因为我的机器有 16gb 的 RAM。在任务管理器中我看到 RAM 显示仍然有很多可用空间(深绿色)(最多只使用 5gb)。它仅使用 1/3 的空间。我在 Windows 7 64 位 16gb RAM Intel I7 CPU 上运行。我在 VS2012 中调试程序。

数据类型是字节(无符号字符)。是的,正如有人在下面的答案中提到的,我编译为 32 位。

4

1 回答 1

6

1280 x 720 x 3(字节/像素)= 2764800 字节/图像 = 2.64 MB/图像(我在这里假设 24 bpp 图像)

2.64 MB/图像 x 650 图像 = 1713.87 MB,非常接近可怕的 2 GB 边界。这让我觉得您在 64 位操作系统上运行,但您的应用程序被编译为没有/LARGEADDRESSAWARE链接器标志的 32 位应用程序,因此它只有 2 GB 的虚拟地址空间可用1

为了轻松利用您机器上可用的物理 RAM,您可以将您的程序编译为 64 位应用程序(从而呈现与虚拟地址空间限制基本无关的内容)。其他方法要复杂得多(通常它们涉及自己管理内存的“滑动窗口”)。

另一种选择是使用/LARGEADDRESSAWARE链接器标志编译您的应用程序,但实际上您将在使用/3GB内核选项启动的 32 位系统或 64 位系统上获得更多内存(分别多 1 GB 和多 2 GB);此外,鉴于可以设置地址的高位,那么在处理指针时必须小心(减法和比较可能很棘手)。


  1. 实际上,32 位指针可以寻址完整的 4 GB 虚拟地址空间,但上半部分默认为系统保留。
于 2013-05-16T12:38:10.823 回答