0

我有这个结构:

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

4

2 回答 2

2

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

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

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

于 2011-04-28T18:54:08.780 回答
2

您可能想查看有关使用的参考,std::vector例如http://www.cplusplus.com/reference/stl/vector/或购买一本好的 STL 书。您正在以我认为非正统的方式使用一些方法。

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

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

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

于 2011-04-28T18:55:36.827 回答