С ++ алгоритм Floodfill падает в XCode - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть простая функция заливки, за исключением того, что она вылетает при слишком большом количестве освобождения во время работы.

#include <vector>
cv::Mat fillLayer(cv::Mat filledEdge, int y, int x, int oldColor, float newColor){
    cv::Size shape = filledEdge.size();
    int h = shape.height;
    int w = shape.width;

    std::vector<int> theStackx = {x};
    std::vector<int> theStacky = {y};


    while (theStacky.size() > 0){
        y = theStacky.back();
        x = theStackx.back();
        theStacky.pop_back();
        theStackx.pop_back();

        if (x == w){
            continue;
        }
        if (x == -1){
            continue;
        }
        if (y == -1){
            continue;
        }
        if (y == h){
            continue;
        }

        if (filledEdge.at<float>(y, x) != oldColor){
            continue;
        }

        filledEdge.at<float>(y, x) = newColor;

        //up
        theStacky.push_back(y + 1);
        theStackx.push_back(x);
        //down
        theStacky.push_back(y - 1);
        theStackx.push_back(x);
        //right
        theStacky.push_back(y);
        theStackx.push_back(x + 1);
        //left
        theStacky.push_back(y);
        theStackx.push_back(x - 1);
    }
    return filledEdge;

}

Функция, выполняющая заливку, - fillSurface.который проходит через все пиксели в мате и заполняет их разным цветом для заливкиfar устанавливает точку останова на malloc_error_break (), чтобы увидеть, где именно я получаю разрыв.Это приводит к функции заливки.

enter image description here

Мне интересно, есть ли способ исправить это.Если нет, то какой будет лучшая альтернатива?

1 Ответ

0 голосов
/ 15 ноября 2018

Я не могу напрямую воспроизвести вашу проблему без MCVE, и я сам не знаю резюме. Но я могу сделать некоторые предположения, которые могли бы помочь.

Ошибка времени выполнения: «Неверная контрольная сумма для освобожденного объекта ...: возможно, изменена после освобождения.»

Первый совет, который вам дает, заключается в том, что такие проверки кучи обычно выполняются только тогда, когда выполняются операции с кучей, а не когда происходит повреждение. В вашем коде нет явных операций с кучей (например, new или delete). Использование кучи здесь происходит из хорошо документированных и хорошо протестированных структур данных из стандартной библиотеки (vector) и cv (Mat).

Второй намек - probably modified after being freed, но он неполный - другая возможность - это написание некоторого кода за его пределами - либо переполнение буфера, либо неправильная индексация массива, либо что-то в этом роде.

И этот последний бит приводит нас к документации по CV для класса Mat, в которой нигде не упоминается, что происходит, если вы плохо проиндексировали Mat. имеет предупреждения о том, что вы используете правильный тип элемента, иначе все может пойти не так. И эти вещи вместе могут быть очень сильным намеком на то, что, если вы получите доступ к Мату неправильно, могут произойти плохие вещи. Например, если вы пишете, возможно, повреждение памяти.

Все вместе, вместе с моим комментарием выше о том, что вы объявляете переменные h и w, но не используете их - и что именно, по вашему мнению, вы должны использовать h и w для - должно: Вам предстоит долгий путь к выяснению того, как куча была повреждена, до такой степени, что система времени выполнения жалуется на это.

Оповещение о спойлере (для получения наилучших результатов только чтение после вы решили проблему):

...