C ++ / 3D Terrain:std :: vector push_back()与c0000374崩溃

时间:2014-11-25 23:58:39

标签: c++ memory-management vector 3d terrain

当试图推回UINT向量时,procrma与Critical error detected c0000374崩溃。以下是初始代码:

void Terrain::CreateIndexList(UINT Width, UINT Height){
    UINT sz_iList = (Width - 1)*(Height - 1) * 6;
    UINT *iList = new UINT[sz_iList];
    for (int i = 0; i < Width; i++){
        for (int j = 0; j < Height; j++){
            iList[(i + j * (Width - 1)) * 6] = ((UINT)(2 * i));
            iList[(i + j * (Width - 1)) * 6 + 1] = (UINT)(2 * i + 1);
            iList[(i + j * (Width - 1)) * 6 + 2] = (UINT)(2 * i + 2);
            iList[(i + j * (Width - 1)) * 6 + 3] = (UINT)(2 * i + 2);
            iList[(i + j * (Width - 1)) * 6 + 4] = (UINT)(2 * i + 1);
            iList[(i + j * (Width - 1)) * 6 + 5] = (UINT)(2 * i + 3);
        }
    }
    for (int i = 0; i < sz_iList; i++){
        Geometry.IndexVertexData.push_back(iList[i]);
    }
delete[] iList;
}

目标是从iList数组中获取生成的索引并填充Geometry.IndexVertexData向量数组。在调试时,我已经创建了其他几个实现:

//After creating the iList array:

Geometry.IndexVertexData.resize(sz_iList); //Fails with "Vector subscript out of range?"
UINT in = 0;
for (int i = 0; i < Width; i++){
    for (int j = 0; j < Height; j++){
        Geometry.IndexVertexData[(i + j*(Width - 1)) * 6] = iList[in];
        in++;
        Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 1] = iList[in];
        in++;
        Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 2] = iList[in];
        in++;
        Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 3] = iList[in];
        in++;
        Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 4] = iList[in];
        in++;
        Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 5] = iList[in];
        in++;
    }
}

最后,直接向量实现:

Geometry.IndexVertexData.reserve(sz_iList); 
for (int index = 0; index < sz_iList; index+=6) { 
    Geometry.IndexVertexData[(i + j*(Width - 1)) * 6] = ((UINT)(2 * i));
    Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 1] = (UINT)(2 * i + 1);
    Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 2] = (UINT)(2 * i + 2);
    Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 3] = (UINT)(2 * i + 2);
    Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 4] = (UINT)(2 * i + 1);
    Geometry.IndexVertexData[(i + j*(Width - 1)) * 6 + 5] = (UINT)(2 * i + 3);
}

sz_iList的最终值为2166,由20x20(总共400个点)的网格生成,用于初始化大小。在所有情况下,矢量数组都不会完全填充,与Critical error detected c0000374一起崩溃。我做错了吗?

1 个答案:

答案 0 :(得分:2)

您的sz_iList似乎不够大。让我们使用Width = Height = 2;,然后是sz_iList = (2 - 1) * (2 - 1) * 6 = 6的简单示例,对吗?但是在您的嵌套循环中,最后一次迭代发生在i = j = 1iWidth小1且j小于Height)的情况下,其中(在循环的最后一行中,您尝试访问元素(i + j * (Width - 1)) * 6 + 5 = (1 + 1 * (2 - 1)) * 6 + 5 = (1 + 1 * 1) * 6 + 5 = 2 * 6 + 5 = 17,它大于数组的大小。这会导致未定义的行为。