2013-05-16 44 views
3

我有一个C++应用程序,它在运行时生成原始位图图像,并将它们推入临时std :: vector中,在每次写入时动态分配内存,然后用于写入这些图像在程序存在之前存档。目前,位图大小是1280x720。我在帧650 + -3帧后出现“错误分配”错误。我很清楚这样做的原因是RAM内存不足。这是因为如果我制作的尺寸较小(让300x200),我设法存储所有950帧ok.It很奇怪,因为我的机器有16GB的RAM.Also在任务管理器,我看到RAM显示仍然有很多免费(深绿色)空间(最多只能使用5GB)。利用只有1/3的空间。我运行在Windows 7 64位16GB内存英特尔I7 CPU。我正在调试VS2012中的程序。是否有可能操作系统限制动态分配到一些任意大小?如果是的话,如何可以我解除这个限制?在内存中缓存位图数据时发生错误分配错误

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

+0

什么是您的样品的类型? char,int还是double? –

回答

6

1280×720×3(字节/像素)= 2764800字节/图像= 2.64 MB /图像(我假定这里24个BPP图像)

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

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

另一个选择是使用/LARGEADDRESSAWARE链接器标志编译应用程序,但是您将在使用/3GB内核选件启动的32位系统或64位系统上分别获得更多内存(分别为1 GB和2 GB更多);同样,考虑到地址的高位可以设置,那么你必须小心你在做什么指针(减法和比较可能会很棘手)。


  1. 实际上,32个指针可以解决一个完整的4 GB虚拟地址空间,但上半部分被保留用于该系统通过默认。
+0

太棒了!这可能是这里的问题。我会尝试使用64位版本进行重新编译。 –

+0

我正在编译一个32位的应用程序,它只是在到达* 1GB *边界(在VS 2015下调试)时抛出一个'std :: bad_alloc'错误 - 而不是2GB。什么可能导致这种情况?上半场是保留的吗? – PinkTurtle

+0

@PinkTurtle:它是一个单一的大分配? –