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

std::vector Assertion failed (vector iterators incompatible)

本文关键字:vector 不兼容 迭代器 失败 断言 std      更新时间:2023-10-16

我有这样一个结构体:

struct MxMInstanceData
{
    D3DXVECTOR2 mTransform;
    float mSpacing;
};

然后我创建一个向量MxMInstanceData:

std::vector<MxMInstanceData> instInFrustumData;

如果我调用instInFrustumData.clear(),我得到这个错误:

断言失败(vector迭代器)不兼容)

矢量创建代码:

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()

您可能需要查看有关使用std::vector的参考资料,如http://www.cplusplus.com/reference/stl/vector/或购买一本好的STL书籍。你在用一些我认为不正统的方法。

  • 使用empty()来检查向量是否有元素(如果不是空的,清除只是读取更好)
  • 尽可能使用局部作用域变量(不需要留在作用域内的东西不应该留在作用域内)
  • 在循环中使用STL迭代器或容器大小(是否需要在一个循环中使用两个递增的整数?)
  • 使用"最佳" STL容器为您的实现(您想要向量或地图在这里吗?)
  • 避免c风格的强制类型转换和对象的滥用((void**) &instInFrustumData是一个非常糟糕的主意)

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

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

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

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

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