std :: vector使用back(),pop_back(),push_back(),get' double free或corruption'错误

时间:2018-05-23 23:49:55

标签: c++ vector std corruption double-free

我有以下代码:

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系统的一部分是分支,当有一个&#39; [&#39;字符,表示旋转和位置保存,稍后将使用。例如,如果我的L系统类包含字符串"[PPPPrrFp[[X]PX]pXRR]",我将收到以下错误: *** Error in /home/user/program/dist/Debug/GNU-Linux/world': double free or corruption (fasttop): 0x0000000003f43240 ***

我知道逐步完成此计划并不容易,我不希望任何人这样做。我只是想知道是否很容易看出程序出了什么问题。我知道这个错误可能与使用一些std :: vector方法/函数有关,但是我没有看到它导致它的原因或方式。

此外,它不一致。有时程序会顺利运行,有时它会因我提到的错误而崩溃。

偏航,俯仰和翻滚的功能无关紧要。

根据我用Google搜索,我只能在处理具有构造函数,析构函数和删除数组等的类时找到此错误的示例。

感谢您的帮助!我希望发生的事情很明显,并且不会花费太多时间。如果它确实看起来需要太长时间,那就不要打扰了。再次感谢。

编辑:为了让人们了解函数中发生的事情,我将逐步解释函数: 从公理字符串的索引0开始,检查它是否开始一个新的分支(&#39; [&#39;),如果是,则按下/保存3D矢量pos和rot - &gt;如果当前的字符不是&#39; [&#39;或者&#39;]&#39;然后移动pos或旋转 - &gt;如果分支从最后保存的pos和rot中结束(&#39;]&#39;),则弹出堆栈的顶部 - &gt;继续对字符串中的每个字符进行处理。

0 个答案:

没有答案