'iterator not dereferencable'C ++ Stack

时间:2012-12-04 21:25:23

标签: c++ vector stack std l-systems

不知道这里发生了什么。我有一堆标准的Vector3D(我的导师给我一个三维矢量类)。我已经将两个Vector3D推到了堆栈上,但是当我使用vectorStack.top()去顶部时,我对这个非常无益的错误感到满意:

Debug Assertion失败!

表达式:deque迭代器不可解除引用

我想也许Vector3D拷贝构造函数有问题但是我已经尝试制作我自己的快速Vector3D结构(删除我给出的旧结构)并且它也不起作用!

以下是代码:

D3Dapp.cpp
if (!lsys.initialised)
{
    LSystem::ReproductionRule r1;
    r1.from = 'F';
    r1.to = "F+F-[FFF]";
    lsys.rules.push_back(r1);

    LSystem::ReproductionRule r2;
    r2.from = 'F';
    r2.to = "FF";
    lsys.rules.push_back(r2);

    lsys.result = lsys.generateResult("F", 0, 5);
    lsys.currentPosition = Vector3D(0.0f,0.0f,0.0f);
    lsys.vectorStack.push(lsys.currentPosition);

    lsys.initialised = true;
}

  lsys.result = "[FF]+FF";

if (!lsys.complete)
{
    for (int i=0; i < lsys.result.length();i++)
    {
  // F move forward
        if (lsys.result[i] == 'F')
        {
            float cosAng = cos(lsys.angle);
            float sinAng = sin(lsys.angle);

    Vector3D currentPosition(lsys.vectorStack.top());

            Vector3D newPosition = Vector3D(
                currentPosition.x + (cosAng * 0.5f), 
                currentPosition.y + (sinAng * 0.5f), 
                currentPosition.z);

            //lsys.vectorStack.push(newPosition);

            Vertex s, e;
            s.x = currentPosition.x;
            s.y = currentPosition.y;
            s.z = currentPosition.z;
            e.x = newPosition.x;
            e.y = newPosition.y;
            e.z = newPosition.z;

            startList.push_back(s);
            endList.push_back(e);

            lsys.currentPosition = newPosition;

    // + turn right
        } else if (lsys.result[i] == '+')
        {
            float rdn = 3.141592f / 180.0f;
            lsys.angle = (lsys.angle + 20.0f);

    // - turn left
        } else if (lsys.result[i] == '-')
        {
            float rdn = 3.141592f / 180.0f;
            lsys.angle = (lsys.angle - 20.0f);

    // [ push stack
        } else if (lsys.result[i] == '[')
  {
    lsys.vectorStack.push(lsys.currentPosition);

    // ] pop stack
  } else if (lsys.result[i] == ']')
  {
    lsys.vectorStack.pop();
  }
    }

    lsys.currentPosition = Vector3D(0.0f,0.0f,0.0f);
}

lsys.complete = true;

lsystem中的堆栈只是stack<Vector3D> vectorStack;

我尝试过将vectorStack.top()分配到当前位置的各种方法,但似乎没有任何工作。

为了完整性,这里是Vector3D的构造函数:

Vector3D.h
Vector3D() {
    x = y = z = 0;
}

Vector3D(double a, double b, double c) {
    x = a;
    y = b;
    z = c;
}

Vector3D(const Vector3D& v) {
    x = v.x;
    y = v.y;
    z = v.z;
}

编辑:证明堆栈中有东西 screenshot

这是堆栈中引发错误的行 screenshot2

2 个答案:

答案 0 :(得分:1)

我只能想到两种可能导致这种问题的方法。首先,你的程序中某处存在内存损坏,这可能是我们应该在消除其他选项后才考虑。

第二个选项是堆栈实际上是空的。您的屏幕截图没有向我们显示堆栈的内部大小,它只向我们显示在某些时候它为两个项目分配内存并将它们推送到堆栈上。很可能你已经关闭了那些项目并且堆栈是空的但仍然指向看似有效的内存。你可以通过推送和弹出一些cout到你的堆栈来证明或反驳这一点,并在调用lsys.vectorStack.size()之前打印top

答案 1 :(得分:0)

事实证明我正在使用的框架(被迫使用)构建时考虑到非常严格的内存要求,有几次调用ZeroMemory似乎只分配了这么多的内存和这个内存量。 / p>

因此,当我开始添加一堆动态内存结构(如堆栈和向量)时,一切都会变成地狱。

ZeroMemory( this, sizeof(D3dApp) )

在删除上述内容之后,我仍然遇到了一些问题,但我遵循了Mark B的建议,现在又开始运行了。

非常感谢。