首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用back()、pop_back()、push_back()的std::vector出现'double free or corruption‘错误

使用back()、pop_back()、push_back()的std::vector出现'double free or corruption‘错误
EN

Stack Overflow用户
提问于 2018-05-24 07:49:55
回答 1查看 332关注 0票数 1

我有以下代码:

代码语言:javascript
复制
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;
            }
        }
    }
}

这段代码的重点是计算海龟将遵循的axiom字符串。这是一个L-系统,L-系统的点的一部分是分支,当有一个'[‘字符时就会发生分支,这意味着旋转和位置得到保存,稍后将使用。例如,如果我的L-system类包含字符串"[PPPPrrFp[[X]PX]pXRR]",我将得到以下错误:*** Error in /home/user/program/dist/Debug/GNU-Linux/world': double free or corruption (fasttop): 0x0000000003f43240 ***

我知道一步一步地完成这个程序并不容易,我也不期望任何人会这样做。我只是想知道是否很容易发现程序的问题所在。我知道这个错误可能与使用一些std::vector方法/函数有关,但我不明白它是为什么或如何导致它的。

而且,这也是不一致的。有时程序会运行,没有任何故障,有时会崩溃,并出现我提到的错误。

偏航、俯仰和横摇的函数应该不重要。

从我搜索过的内容中,我只能在处理具有构造函数、析构函数的类以及删除数组时找到这个错误的例子。

谢谢你的帮助!我希望发生的事情是显而易见的,不要花太多时间。如果它确实看起来会花费太长的时间,那么就不要费心了。再次感谢。

编辑:为了更容易理解函数中发生的事情,我将一步一步地解释这个函数:从axiom字符串的索引0开始,检查它是否开始了一个新的分支('['),如果它开始了,则推送/保存3D向量pos和rot ->如果当前字符不是'‘或'’,则移动pos或旋转->如果分支结束(']')从最后保存的pos和rot重新启动,并弹出堆栈顶部->继续搜索字符串中的每个字符。

EN

回答 1

Stack Overflow用户

发布于 2018-05-24 08:47:53

以防来自未来的人遇到这个问题。我所做的错误是没有在我的函数中返回任何东西,即使我为该函数指定了一个非void的返回类型。将返回类型更改为void解决了我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50498998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档