std :: vector断言失败(矢量迭代器不兼容)

时间:2011-04-28 18:17:53

标签: c++ std stdvector

我有这个结构:

struct MxMInstanceData
{
    D3DXVECTOR2 mTransform;
    float mSpacing;
};

然后我创建了一个MxMInstanceData的向量:

std::vector<MxMInstanceData> instInFrustumData;

如果我致电instInFrustumData.clear(),我会收到此错误:

  

断言失败(向量迭代器   不相容)

矢量创建代码:

instInFrustumData.reserve(mNumInstances);

矢量更新代码:

void Terrain::updateInstances()
{
    mNumInstancesInFrustum = 0;

    if(instInFrustumData.size() != 0)
        instInFrustumData.clear();

    mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData);

    for(int x = 0; x < mNumInstances; x++)
    {
        if(mpCamera->point2DInFrustum(instData[x].mTransform + 
            D3DXVECTOR2(instData[x].mSpacing/2 + mpCamera->getPosition().x, instData[x].mSpacing/2 + mpCamera->getPosition().z), instData[x].mSpacing/2)
            != OUTSIDE)
        {
            instInFrustumData.push_back(instData[x]);
            mNumInstancesInFrustum++;
        }
    }

    mpMxMInstInFrustumB->Unmap();
}

是什么让这种情况发生?

在我班级的析构函数中,我也称为clear()

2 个答案:

答案 0 :(得分:2)

有点猜测,但也许你的问题就在这一行:

mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData);

你正在将一个指向矢量本身的指针传递给这个Map函数,我猜这可能会覆盖它的一些内部函数?我没有它的文档,但它看起来不像是一个期望指向向量的函数:)

答案 1 :(得分:2)

您可能希望查看有关使用std::vector http://www.cplusplus.com/reference/stl/vector/的参考资料或购买优质STL图书的参考资料。你正在使用一些我认为非正统的方法。

  • 使用empty()检查向量是否包含元素(如果不是空的,则只读更好)
  • 尽可能使用本地范围的变量(不需要留在范围内的事物)
  • 在循环中使用STL迭代器或容器大小(在一个循环中需要两个递增整数?)
  • 使用“best” STL容器进行实施(你想要这里的矢量或地图吗?)
  • 避免C风格的演员表和滥用对象((void**) &instInFrustumData是一个非常糟糕的主意)

你有很多成员变量,其定义未知,未知方法Map()UnMap()仍然没有使用与原始错误相关的迭代器显示任何代码。我猜你使用instData[x]是危险的,也是有问题的,以及循环的构造方式。您还真的不希望将STL容器视为STL容器。像(void**) &instInFrustumData这样的事情应该避免,因为它们只会导致问题。

我强烈建议您在处理DirectX或用两者编写的图形和游戏引擎之前先学习C ++。