c++ - 内存位置的另一个 std::bad_alloc

标签 c++

我搜索了一下这种错误,发现了很多。不幸的是,没有线程真正帮助我。

我有图像文件,我将它们保存在 arrayvector 或其他任何格式中。

在大约 1.8 GB(~1439 个图像)之后,内存位置发生错误 std::bad_alloc。因此,我尝试以不同的方式声明 array,但每次都出现相同的错误。

Image* img;
Image img[180000];
Image* img = new Image[180000]

vector<Image> img;

(180k 将是 1 分钟的帧数)。录制 1 分钟并不重要,但如果能保存超过 ~1439 帧就更好了。或者至少了解为什么会发生此错误,或者为什么会在 1.8 GB 时发生。

也许有人可以帮助我或向我解释一下?

PS:我用的是32位系统


问题是,将图像保存在文件夹或其他东西中的时间太长了。也许我必须找到一种压缩方法,它可以让我只在数组中保存图像的必要信息,然后我可以在完成后恢复帧。

我听说您可以仅在包含所有这些信息的 x 和 y“线”中转换图像。但这如何运作是另一个问题。

Mark Ingram 的回答正是我理解问题所需要的。谢谢你

编辑:哦,我发现我对我的问题的解释还不够。我没有图像并将它们加载到我的程序中。我有一个以 50Hz 频率记录帧的相机,所以在记录时我没有时间保存帧。

最佳答案

您的内存不足。在 32 位系统上(至少在 Windows 上),您最多只能分配 ~2GB 的内存。你只需要在需要的时候动态加载你的数据,当你不再需要图像数据时,再把它扔掉。

实际上,限制将低于 2GB,因为内存是按 block 分配的(即它不是连续分配的)。这意味着如果混合使用小型和大型对象分配,您将遇到堆碎片,这将大大减少您实际可以分配的内存量。

关于c++ - 内存位置的另一个 std::bad_alloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17829051/

相关文章:

c++ - 如何在c++的命名空间下转发声明一个类,比如std::string?

c++ - 递归调用溢出

c++ - 如何创建一个程序来识别最长的子串回文而不考虑字母大小写

c++ - 以标准输入作为文件名参数的 fopen

c++ - 在没有 key 的情况下读取密文的剩余噪声预算

c++ - 用值替换列表中的元素以新列表结尾

c++ - Makefile - 创建一个静态库

c++ - SDL 卡住但继续运行

c++ - C++ 中 vector<double> 的 ArgMin?

c++ - 公开基类枚举而不用乏味地列出枚举数