【发布时间】:2016-05-06 06:58:55
【问题描述】:
我在尝试使用 Qt 存储一系列图像数据时遇到问题。
这是一段显示问题的代码:
#include <vector>
#include <iostream>
#include <QImage>
...
const int nFrames = 1000;
std::vector<int> sizes(nFrames);
std::vector<uchar*> images(nFrames);
for (int k = 0; k < nFrames; k++)
{
QImage *img = new QImage("/.../sample.png");
uchar *data = img->bits();
sizes.at(k) = img->width() * img->height();
images.at(k) = data;
}
std::cout << "Data loaded \"successfully\"." << std::endl;
for (int k = 0; k < nFrames; k++)
{
std::cout << k << ": " << (int) (images.at(k)[0]) << std::endl;
}
在第一个循环中,程序加载 QImage 对象并将位图放入 images 指针向量中。在第二个循环中,我们只读取每一帧的一个像素。
问题在于,即使堆内存已满,程序也会毫无问题地继续执行第一个循环。结果,我在第二个循环中遇到了崩溃,如程序的输出所示:
Data loaded "successfully".
0: 128
1: 128
2: 128
...
192: 128
[crash before hitting 1000]
要重现问题,您可以使用下面的灰度图,您可能需要更改nFrames 的值,具体取决于您拥有的内存量。
我的问题是:如何在第一个循环中加载数据,以便检测内存是否已满?我不一定需要将 QImage 对象保留在内存中,而只需要将images 向量的数据。
【问题讨论】:
-
顺便说一句,没有必要在堆上创建
QImage。它支持COW。
标签: c++ qt memory heap-memory qimage