c++ - 堆 block 修改超过请求的大小

标签 c++ qt memory qt4 heap-memory

更新:错误似乎是由这一行产生的:*line = color;

我收到以下错误,但我不明白它的来源:

错误:

HEAP[testQt.exe]: Heap block at 0B444FE8 modified at 0B44C6B0 past requested size of 76c0

生成它的行:

return QPixmap::fromImage(qimage);

来自:

QPixmap Interpolation::getData() {
    QPointF pt(0, 0);
    QRgb color;
    QImage qimage(m_width, m_height, QImage::Format_ARGB32);
    qimage.fill(Qt::transparent);

    for (int i(0); i < m_height; ++i) {
        m_progress->setValue(m_width+i);
        QRgb *line = (QRgb *)qimage.scanLine(i);
        for (int j(0); j < m_width; ++j) {
            pt.setX(j);
            pt.setY(i);
            line += 1;
            if (isInHull(pt)) {
                color = colorScale(interp(&pt));
                *line = color; //If I remove this part the program won't crash
            }
        }
    }  
    return QPixmap::fromImage(qimage);
}

如果有帮助:

QRgb Interpolation::colorScale(qreal value)
{
    int cat;
    cat = qFloor(qreal(9)*(value-m_min)/(m_max-m_min));

    return m_couleurs[cat];
}

与:

m_couleurs[0] = qRgb(247, 252, 240);
m_couleurs[1] = qRgb(224, 243, 219);
m_couleurs[2] = qRgb(204, 235, 197);
m_couleurs[3] = qRgb(168, 221, 181);
m_couleurs[4] = qRgb(123, 204, 196);
m_couleurs[5] = qRgb(78, 179, 211);
m_couleurs[6] = qRgb(43, 140, 190);
m_couleurs[7] = qRgb(8, 104, 172);
m_couleurs[8] = qRgb(8, 64, 129);

如有任何线索,我们将不胜感激。

编辑:添加了完整的功能以备不时之需。 Edit2:使代码更清晰并删除了无用的部分。 Edit3:更新了问题。

最佳答案

在为 *line 分配颜色之前先行。因此,当 j = 0 时,您实际上将像素 1 设置在最后一个扫描行的最后一个像素的末尾,您写入缓冲区末尾。

将行 += 1 移动到循环的末尾。

关于c++ - 堆 block 修改超过请求的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11158655/

相关文章:

unit-testing - 使用 Qt Test 测试模态对话框

c++ - 更积极地优化 FMA 操作

c++ - 在 C++ 中使用 std 命名空间的完全限定名称

c++ - 来自 C++ 程序的动画

c++ - Qt中的实时像素绘制

linux - 在 Linux 中通过 QProcess 执行 gzip

memory - WinDbg MEM_COMMIT 为 1GB,eeheap 显示为 150MB,找不到剩余内存

c - 如何在 C 中实现可变长度 ‘string’ -y

javascript - 动态加载/卸载外部JS

c# - Unicode 输入 Windows 8.1 Store App