Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::向量断言失败(向量迭代器不兼容)_C++_Std_Stdvector - Fatal编程技术网

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的情况下保留向量中的容量