【发布时间】:2014-05-20 02:34:32
【问题描述】:
我遇到了一个问题,即制作一些向量会占用大量 RAM。随着代码的进行,它会超过 800 MB,最终导致 std:bad_alloc 错误并终止。
我正在使用 EasyBMP 库,它的 RGBApixel 定义为 4 个无符号字符的结构,分别代表红色、绿色、蓝色、alpha。我正在尝试对所有可能的 24 位(TrueColor)像素进行索引。
我了解此代码过多,并且有更好的方法来执行此操作。但是,这之前运行得很好,我不确定我是否进行了任何更改以导致此问题。
根据我的计算,这应该只占用 64 MB,加上一些向量的开销。感觉在某些时候它是无限循环的,但我已经看了这么久的代码,以至于我无法弄清楚。任何帮助表示赞赏。
vector< vector<RGBApixel> > dict;
dict.reserve(16777216);
for (color r = 0; r < 256; r++)
{
for (color g = 0; g < 256; g++)
{
for (color b = 0; b < 256; b++)
{
vector<RGBApixel> pixels;
RGBApixel pixel;
pixel.Red = r;
pixel.Green = g;
pixel.Blue = b;
pixels.push_back(pixel);
dict.push_back(pixels);
}
}
}
【问题讨论】:
-
RAM 使用!= 堆栈溢出。
-
你有 1600 万个
std::vector对象...每个可能都有自己的缓冲区... -
你说得对,对不起,我修正了标题。
-
为什么要拥有 16M 个每个 1 像素的向量?
-
我知道,这看起来很奇怪。但这是针对我正在从事的一个项目。我完全理解它并不理想,也不应该使用它,但这主要是为了我自己的学习。而且,后来,还有超过 1 个像素的向量。