【发布时间】:2019-01-10 21:54:32
【问题描述】:
我正在制作一个图片编辑程序,但我被困在分配内存中。 我不知道发生了什么。
好的..所以当我这样做时:
std::vector<unsigned char> h;
for (int a = 0; a < 10000 * 10000 * 3; a++) {
h.push_back(0);
}
这很好(对不起,我不得不这样做),但是当我这样做时:
std::vector<std::vector<std::vector<unsigned char>>> h;
for (uint32_t a = 0; a < 10000; a++) {
h.push_back({});
for (uint32_t b = 0; b < 10000; b++) {
h.at(a).push_back({});
for (uint32_t c = 0; c < 3; c++) {
h.at(a).at(b).push_back(0xff);
}
}
}
我的内存使用量激增,并且出现错误:Microsoft C++ 异常:std::bad_alloc at memory location 0x009CF51C
我正在使用 .bmp。
目前,代码处于测试模式,所以基本上是一团糟…… 我今年 15 岁,所以不要对我抱太大期望。
我正在寻找解决方案,但我发现的只是如何处理大整数等等......
如果你能给我可能的另一个解决方案,但我希望我的代码尽可能地对初学者友好。
【问题讨论】:
-
我怀疑您的图像尺寸是 10000 x 10000,并且您想存储像素 RGB 值?您可以使用一些库(例如 opencv)来有效地做到这一点。使用嵌套向量根本不适合。
-
您可能想要构建一个 64 位应用程序。对于 300MB 的图像,它很容易填充可用的地址空间(可能小于 2GB,大约 1.2GB 是连续的)。使用 64 位应用程序将消除这两个问题。
-
问题可能是“向量通常比静态数组占用更多的空间,因为分配了更多的内存来处理未来的增长。” ref。因此,在第二种情况下,实际大小可能比第一种情况下已经很大的 10000*10000*3=300MB 向量大得多。我建议使用第一种情况和将 x,y 位置转换为矢量索引的函数:
index = (y * width) + x.
标签: c++