在内存中缓存位图数据时出现错误的分配错误 我有一个C++应用程序,它在运行时生成原始位图图像,并将这些图片推到临时STD::矢量在每个写上动态分配内存,然后在程序存在之前将这些图像写入文件。在第650帧+-3帧之后,我出现了“错误分配”错误。我很清楚,原因是RAM内存不足。这是因为如果我使用较小的大小(比如300x200)我成功地存储了所有950帧。这很奇怪,因为我的机器有16gb的RAM。在任务管理器中,我还看到RAM显示器仍然有很多可用(深绿色)空间(最多只能使用5gb)。它只利用了1/3的空间。我在Windows 7 64位16gb RAM Intel I7 CPU上运行。我正在VS2012中调试该程序。操作系统是否可能将动态分配限制为任意大小?如果是,我如何取消该限制

在内存中缓存位图数据时出现错误的分配错误 我有一个C++应用程序,它在运行时生成原始位图图像,并将这些图片推到临时STD::矢量在每个写上动态分配内存,然后在程序存在之前将这些图像写入文件。在第650帧+-3帧之后,我出现了“错误分配”错误。我很清楚,原因是RAM内存不足。这是因为如果我使用较小的大小(比如300x200)我成功地存储了所有950帧。这很奇怪,因为我的机器有16gb的RAM。在任务管理器中,我还看到RAM显示器仍然有很多可用(深绿色)空间(最多只能使用5gb)。它只利用了1/3的空间。我在Windows 7 64位16gb RAM Intel I7 CPU上运行。我正在VS2012中调试该程序。操作系统是否可能将动态分配限制为任意大小?如果是,我如何取消该限制,c++,memory,C++,Memory,数据类型是字节(无符号字符)。是的,正如下面回答中提到的,我编译32位。1280 x 720 x 3(字节/像素)=2764800字节/图像=2.64 MB/图像(这里假设24个bpp图像) 2.64 MB/图像x 650图像=1713.87 MB,非常接近可怕的2 GB边界。这让我觉得您运行的是64位操作系统,但您的应用程序编译为32位应用程序,没有/largeaddressware链接器标志,因此它只有2 GB的可用虚拟地址空间1 要轻松利用计算机上可用的物理RAM,您可以将程序编译为64位

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

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

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

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

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


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

  • 你们的样品是什么类型的?字符,整数还是双精度?太好了!这可能就是这里的问题所在。我将尝试使用64位版本重新编译。我正在编译一个32位应用程序,它在达到1GB边界时(在VS 2015下调试)会抛出一个
    std::bad_alloc
    错误,而不是2GB。这是什么原因造成的?前半部分是保留的吗?@PinkTurtle:是单个大分配吗?不确定您指的是什么,但加载是在为对象的所有实例调用的对象函数中进行的。从视觉上看,内存使用情况显示在“进程内存”中,其中的内存将稳定地增加到1GB,然后抛出一个错误的alloc错误。实际上,我正在将数据推送到实例向量成员。更具体地说,我正在读取一个测试200MB的纯文本.obj文件(3d模型),并在for循环中将顶点数据推送到它的网格中。没有什么能比得上一个巨大的var实例。我真的在一点一点地推顶点。