std :: vector с использованием back (), pop_back (), push_back (), получить ошибку «двойного освобождения или повреждения» - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующий код:

struct branchInfo{
    Quaternion r;
    Vector3 p;

    std::vector<Vector3> branchPoints;
};

std::vector<Vector3> LSystem::Turtle(){

    std::vector<branchInfo> b;

    // The axiom should always start with a '[' at the start and a ']' at the end
    for(unsigned int i = 0; i < axiom.length(); i++) {
        char c = axiom[i];

        if (c == '[') {
            branchInfo temp;

            temp.r = rotationQuat;
            temp.p = position;
            temp.branchPoints.push_back(position);

            b.push_back(temp);
        } else if (c == ']') {
            branchInfo temp = b.back();

            rotationQuat = temp.r;
            position = temp.p;
            branches.push_back(temp.branchPoints);

            b.pop_back();
        } else {
            // Evaluate the character and move the turtle
            // F = move forward according to pitched, rolled, and yawed axis
            // f = move backward according to pitched, rolled, and yawed axis
            // p = pitch -45 degrees
            // P = pitch +45 degrees
            // r = roll -45 degrees
            // R = Roll +45 degrees
            // y = yaw -45 degrees
            // Y = yaw +45 degrees
            // [ = start new branch
            // ] = end new branch

            switch(c) {
            case 'f':
                b.back().branchPoints.push_back(Forward(-1.5f));
                break;
            case 'F':
                b.back().branchPoints.push_back(Forward(1.5f));
                break;
            case 'p':
                Pitch(-angle);
                break;
            case 'P':
                Pitch(angle);
                break;
            case 'r':
                Roll(-angle);
                break;
            case 'R':
                Roll(angle);
                break;
            case 'y':
                Yaw(-angle);
                break;
            case 'Y':
                Yaw(angle);
                break;
            }
        }
    }
}

Смысл этого кода - оценить строку аксиомы, которой будет следовать черепаха.Это L-система, и часть смысла L-системы состоит в том, чтобы иметь ветвление, и это происходит, когда есть символ «[», который означает, что поворот и положение сохраняются и будут использоваться позже.Например, если мой класс L-системы содержит строку "[PPPPrrFp[[X]PX]pXRR]", я получу следующую ошибку: *** Error in /home/user/program/dist/Debug/GNU-Linux/world': double free or corruption (fasttop): 0x0000000003f43240 ***

Я знаю, что не легко пошагово пройти эту программу, и яне ожидайте, что кто-нибудь сделает это.Мне просто интересно, легко ли увидеть, что не так с программой.Я понимаю, что ошибка, вероятно, связана с использованием некоторых методов / функций std :: vector, но я не понимаю, почему или как она это вызывает.

Кроме того, она не соответствует.Иногда программа запускается без заминки, а в других случаях происходит сбой с упомянутой ошибкой.

Функции для Yaw, Pitch и Roll не должны иметь значения.

Из того, что у меня естьgoogled, я могу найти примеры этой ошибки только при работе с классами, имеющими конструкторы, деструкторы, а также при удалении массивов и т. д.

Спасибо за любую помощь!Я надеюсь, что это очевидно, что происходит и не занимает слишком много времени.Если это выглядит так, как будто это займет слишком много времени, не беспокойтесь.Еще раз спасибо.

РЕДАКТИРОВАТЬ: Чтобы было проще понять, что происходит в функции, я сделаю пошаговое объяснение функции: начните с индекса 0 строки аксиомы и проверьте, если этозапускает новую ветвь ('['), и если это происходит, нажмите и сохраните трехмерный вектор pos и rot ->, если текущий символ не является '[' или ']', затем переместите pos или поверните ->, если ветвь заканчивается(']') восстановить из последней сохраненной позиции и гнили, и вытолкнуть верхнюю часть стека -> продолжать идти для каждого символа в строке.

1 Ответ

0 голосов
/ 24 мая 2018

На случай, если кто-то из будущего столкнется с этой проблемой.Что я делал неправильно, так это то, что в моей функции ничего не возвращалось, хотя для функции я указывал не возвращаемый тип возврата.Изменение типа возвращаемого значения на void решило мою проблему.

...