Блок кучи изменен за пределы запрошенного размера

Обновление: ошибка, по-видимому, вызвана этой строкой: *line = color;

Я получаю следующую ошибку, но я не понимаю, откуда она может взяться:

Ошибка:

HEAP[testQt.exe]: блок кучи по адресу 0B444FE8 изменен по адресу 0B44C6B0 после запрошенного размера 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: обновил вопрос.


person Leo    schedule 22.06.2012    source источник
comment
Ничто не выскакивает, но есть некоторые вещи, которые вы можете сделать, чтобы сузить его. Ошибка возникает, если вы закомментируете весь второй цикл? (начиная с for (int i(0); i < m_height; ++i) и заканчивая совпадающим }? Если ошибка исчезнет, ​​то, вероятно, проблема именно в этом.   -  person Evan Teran    schedule 22.06.2012
comment
@Evanteran Проблема, похоже, исчезнет, ​​если я удалю эту часть. Я собираюсь обновить свой первый пост.   -  person Leo    schedule 22.06.2012
comment
Законно ли это литье? QRgb *строка = (QRgb *)qimage.scanLine(i); qt-project.org/doc/qt-4.8/qimage.html# scanLine scanLine возвращает символ без знака, и вы преобразуете его в целое число без знака doc.qt.nokia.com/4.7-snapshot/qcolor.html#QRgb-typedef   -  person Alessandro Teruzzi    schedule 22.06.2012


Ответы (1)


Вы продвигаетесь вперед до того, как назначите цвет *line. Итак, когда j = 0, вы фактически устанавливаете пиксель 1, в конце последнего пикселя на последней строке сканирования вы записываете за конец буфера.

Переместите строку += 1 в конец цикла.

person Rafael Baptista    schedule 22.06.2012