C++/3D Terrain: std::vector pushback() crashes with c0000374

460 views Asked by At

When attempted to push back a vector of UINT, the progrma crashes with Critical error detected c0000374. Below is the initial code:

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;
}

The goal is to take the generated indices from the iList array and fill the Geometry.IndexVertexData vector array. While debugging this, I've created several other implementations of this:

//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++;
    }
}

And a final, direct to vector implementation:

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 has a final value of 2166, resultant from a grid of 20x20 (400 total points) and is used to initialize sizes. In all cases, the vector array would not fully fill, crashing with Critical error detected c0000374. Am I doing something wrong?

1

There are 1 answers

1
wolfPack88 On BEST ANSWER

Your sz_iList doesn't appear to be big enough. Let's use a simple example of Width = Height = 2;, then sz_iList = (2 - 1) * (2 - 1) * 6 = 6, right? But in your nested loops, the last iteration occurs when i = j = 1 (i is one less than Width and j is one less than Height), where (in the last line of your loop), you try to access element (i + j * (Width - 1)) * 6 + 5 = (1 + 1 * (2 - 1)) * 6 + 5 = (1 + 1 * 1) * 6 + 5 = 2 * 6 + 5 = 17, which is bigger than the size of your array. This results in undefined behavior.