2

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

调试断言失败!

表达式: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;
}

编辑:为了证明堆栈中有东西 截屏

这是堆栈中引发错误的行 截图2

4

2 回答 2

1

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

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

于 2012-12-04T22:35:15.277 回答
0

事实证明,我正在使用(被迫使用)的框架是在考虑非常严格的内存要求的情况下构建的,有几个对 ZeroMemory 的调用似乎只分配了这个内存量和这个内存量。

因此,当我开始添加大量动态内存结构(如堆栈和向量)时,一切都变得糟糕透顶。

ZeroMemory( this, sizeof(D3dApp) )

在删除上述内容之后,我仍然遇到了一些问题,但我遵循了 Mark B 的建议,现在它已经启动并运行了。

非常感谢。

于 2012-12-05T12:50:55.657 回答