尝试删除 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();
}