尝试删除 Qimage 时 Qt 应用程序崩溃 Format_RGB888
Qt application crash when trying to delete Qimage Format_RGB888
我收到 “检测到堆损坏:正常块后...CRT 检测到应用程序在堆缓冲区结束后写入内存。” 当变量 test
被摧毁。
如果我改变图像大小,不会发生崩溃,我认为它与内存对齐有关,但我不知道是什么。
我正在使用 MSVC 2017 64 位的官方 Qt 版本
#include <QCoreApplication>
#include <QImage>
QImage foo(int width, int height)
{
QImage retVal(width, height, QImage::Format_RGB888);
for (int i = 0; i < height; ++i) // read each line of the image
{
QRgb *lineBuf = reinterpret_cast<QRgb *>(retVal.scanLine(i));
for (int j = 0; j < width; ++j)
{
lineBuf[j] = qRgb(0,0,0);
}
}
return retVal;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
QImage test = foo(5,5);
}
return a.exec();
}
正如 GM 在上面的评论中所建议的那样,问题在于 QRgb 是一个 32 位构造。
我更改了用自定义 RGB 结构替换 QRgb 的代码
struct RGB {
uint8_t r;
uint8_t g;
uint8_t b;
};
QImage foo(int width, int height)
{
QImage retVal(width, height, QImage::Format_RGB888);
for (int i = 0; i < height; ++i) // read each line of the image
{
RGB *lineBuf = reinterpret_cast<RGB *>(retVal.scanLine(i));
for (int j = 0; j < width; ++j)
{
RGB tmp;
//.... do stuff with tmp
lineBuf[j] = tmp;
}
}
return retVal;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
QImage test = foo(5,5);
}
return a.exec();
}
我收到 “检测到堆损坏:正常块后...CRT 检测到应用程序在堆缓冲区结束后写入内存。” 当变量 test
被摧毁。
如果我改变图像大小,不会发生崩溃,我认为它与内存对齐有关,但我不知道是什么。
我正在使用 MSVC 2017 64 位的官方 Qt 版本
#include <QCoreApplication>
#include <QImage>
QImage foo(int width, int height)
{
QImage retVal(width, height, QImage::Format_RGB888);
for (int i = 0; i < height; ++i) // read each line of the image
{
QRgb *lineBuf = reinterpret_cast<QRgb *>(retVal.scanLine(i));
for (int j = 0; j < width; ++j)
{
lineBuf[j] = qRgb(0,0,0);
}
}
return retVal;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
QImage test = foo(5,5);
}
return a.exec();
}
正如 GM 在上面的评论中所建议的那样,问题在于 QRgb 是一个 32 位构造。 我更改了用自定义 RGB 结构替换 QRgb 的代码
struct RGB {
uint8_t r;
uint8_t g;
uint8_t b;
};
QImage foo(int width, int height)
{
QImage retVal(width, height, QImage::Format_RGB888);
for (int i = 0; i < height; ++i) // read each line of the image
{
RGB *lineBuf = reinterpret_cast<RGB *>(retVal.scanLine(i));
for (int j = 0; j < width; ++j)
{
RGB tmp;
//.... do stuff with tmp
lineBuf[j] = tmp;
}
}
return retVal;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
{
QImage test = foo(5,5);
}
return a.exec();
}