C++ std::向量断言失败(向量迭代器不兼容)
我有这个结构:C++ std::向量断言失败(向量迭代器不兼容),c++,std,stdvector,C++,Std,Stdvector,我有这个结构: struct MxMInstanceData { D3DXVECTOR2 mTransform; float mSpacing; }; 然后我创建一个MxMInstanceData向量: std::vector<MxMInstanceData> instInFrustumData; 矢量更新代码: void Terrain::updateInstances() { mNumInstancesInFrustum = 0; if(in
struct MxMInstanceData
{
D3DXVECTOR2 mTransform;
float mSpacing;
};
然后我创建一个MxMInstanceData向量:
std::vector<MxMInstanceData> instInFrustumData;
矢量更新代码:
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();
}
void地形::updateInstances()
{
mnumInstanceInforustum=0;
如果(instInFrustumData.size()!=0)
instInFrustumData.clear();
mpMxMInstInFrustumB->Map(D3D10\u Map\u WRITE\u DISCARD,NULL,(void**)和instInFrustumData);
对于(int x=0;xPoint2Info(instData[x].mtTransform+
D3DXVECTOR2(instData[x].Mspacking/2+mpCamera->getPosition().x,instData[x].Mspacking/2+mpCamera->getPosition().z),instData[x].Mspacking/2)
!=室外)
{
instInFrustumData.push_back(instData[x]);
mnuminstancesinformustum++;
}
}
mpMxMInstInFrustumB->Unmap();
}
什么能让这一切发生
在我的类的析构函数中,我也在这里调用clear()这是一种猜测,但您的问题可能是这一行:
mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData);
您正在将一个指向向量本身的指针传递给这个Map函数,我猜这可能会覆盖它的一些内部内容?我没有它的文档,但它看起来不像是一个需要指向向量的指针的函数:)这里有点猜测,但您的问题可能是这一行:
mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData);
您正在将一个指向向量本身的指针传递给这个Map函数,我猜这可能会覆盖它的一些内部内容?我没有它的文档,但它看起来不像是一个需要指向向量的指针的函数:)您可能想查看有关使用
std::vector
的参考资料,或者购买一本好的STL书籍。你用了一些我认为非正统的方法。
- 使用
empty()
- 尽可能使用局部作用域变量(不需要保留在作用域中的内容不应该保留)
- 在循环中使用STL迭代器或容器大小(是否需要在一个循环中使用两个递增整数?)
- 使用“最佳”STL容器进行实现(这里需要向量还是贴图?)
- 避免C风格强制转换和对象滥用(
是一个非常糟糕的主意)(void**)和instInFrustumData
Map()
和UnMap()
,但仍然没有使用与原始错误相关的迭代器显示任何代码。我猜你使用instData[x]
是危险的,也是有问题的,就像循环一般的构造方式一样。您还真的不想将STL容器视为STL容器之外的任何东西。应该避免像(void**)和instInFrustumData
这样的事情,因为它们只会导致问题
<>我强烈建议你先学习C++,然后再处理DirectX或图形和游戏引擎。 你可能想查阅一个引用,使用<代码> STD::向量< /代码>,或者买一本好的STL书。你用了一些我认为非正统的方法。
- 使用
empty()
- 尽可能使用局部作用域变量(不需要保留在作用域中的内容不应该保留)
- 在循环中使用STL迭代器或容器大小(是否需要在一个循环中使用两个递增整数?)
- 使用“最佳”STL容器进行实现(这里需要向量还是贴图?)
- 避免C风格强制转换和对象滥用(
是一个非常糟糕的主意)(void**)和instInFrustumData
Map()
和UnMap()
,但仍然没有使用与原始错误相关的迭代器显示任何代码。我猜你使用instData[x]
是危险的,也是有问题的,就像循环一般的构造方式一样。您还真的不想将STL容器视为STL容器之外的任何东西。应该避免像(void**)和instInFrustumData
这样的事情,因为它们只会导致问题
<>我强烈建议你先学习C++,然后再处理DirectX或图形和游戏引擎。你的代码不能这么多。我发现了另外一件事:在我创建向量之后,我调整了它的大小=容量。我调用clear()并且它是ok的,所以size=0 capacity=100,然后我只用8个值填充它,当我再次调用clear(第二次)时,错误是throuwn。可以使用常量迭代器和非常量迭代器来实现这一点。但是,您需要发布您的实际代码,因为这里的内容不会导致此错误。是的,这也可能是不相关的,因此您仍然应该使用完整形式的向量发布您的实际代码。但是请注意,您应该使用
reserve
在不创建元素的情况下保留向量中的容量resize
将删除元素或展开向量,并根据当前大小和调用时存在的元素可能创建新的空元素。起初我使用reserve,然后我改为调整大小,但错误仍然存在…您发布的代码无法-因此发布更多。我发现另一件事:在创建向量后,我调整了它的大小,使其大小=容量。我调用clear()并且它是ok的,所以size=0 capacity=100,然后我只用8个值填充它,当我再次调用clear(第二次)时,错误是throuwn。可以使用常量迭代器和非常量迭代器来实现这一点。但是,您需要发布您的实际代码,因为这里的内容不会导致此错误。是的,这也可能是不相关的,因此您仍然应该使用完整形式的向量发布您的实际代码。但是请注意,您应该使用reserve
在不创建e的情况下保留向量中的容量