gpt4 book ai didi

c++ - 在内存中缓存位图数据时发生错误分配错误

转载 作者:太空狗 更新时间:2023-10-29 20:27:20 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

要轻松利用计算机上可用的物理 RAM,您可以将程序编译为 64 位应用程序(因此基本上与虚拟地址空间限制无关)。其他方法要复杂一些(通常是自己管理内存的“滑动窗口”)。

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


  1. 实际上,32 位指针可以寻址完整的 4 GB 虚拟地址空间,但上半部分默认为系统保留。

关于c++ - 在内存中缓存位图数据时发生错误分配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16587522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com