std::vector断言失败(vector迭代器不兼容)
std::vector Assertion failed (vector iterators incompatible)
我有这样一个结构体:
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函数,我猜它可能会覆盖它的一些内部?我没有它的文档,但它看起来不像一个函数,期待一个指向向量的指针:)
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- OpenCL 和 std::vector<bool> 不兼容
- 矢量迭代器与 const Vector&不兼容
- OpenCV与std::vector不兼容?(_crtIsValidHeapPointer错误)
- Vector迭代器在类中不兼容
- 调试断言:Vector迭代器不兼容(c++)
- c++ PugiXML Vector迭代器不兼容错误
- Vector迭代器在c++中不兼容
- 在vector中的vector之间移动指针会导致vector迭代器不兼容
- 深度复制Vector时,Vector迭代器不兼容
- std::vector断言失败(vector迭代器不兼容)
- Vector迭代器不兼容错误
- Vector迭代器不兼容