Heap блокът е променен след заявения размер

Актуализация: Грешката изглежда се генерира от този ред: *line = color;

Получавам следната грешка, но не разбирам откъде може да дойде:

Грешката:

HEAP[testQt.exe]: Heap блок при 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 *line = (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)


Преминавате напред към линията, преди да зададете цвят на *линия. Така че, когато j = 0, вие всъщност задавате пиксел 1, в края на последния пиксел на последния ред за сканиране, който пишете след края на буфера.

Преместете линия += 1 до края на цикъла.

person Rafael Baptista    schedule 22.06.2012