C ++堆损坏:导致问题的本地堆变量

时间:2012-05-14 15:40:22

标签: c++ heap corruption

我正在使用DirectX9通过手动组装地面的顶点来处理一些简单的地形。

在我设置索引的代码中,我得到了一个错误:

Windows在test.exe中触发了断点。

这可能是由于堆损坏,这表示test.exe或其加载的任何DLL中存在错误。

这是我的代码中给我带来问题的部分,我几乎100%确定它链接到我的索引指针,但是当我完成时我将其删除...所以我不是确定问题是什么。

int total = widthQuads * heightQuads * 6;
DWORD *indices = new DWORD[totalIdx];
for (int y = 0; y < heightQuads; y++)
{
    for (int x = 0; x < widthQuads; x++)
    { //Width of nine:
        int lowerLeft = x + y * 9;
        int lowerRight = (x + 1) + y * 9;
        int topLeft = x + (y + 1) * 9;
        int topRight = (x + 1) + (y + 1) * 9;
        //First triangle:
        indices[counter++] = topLeft;
        indices[counter++] = lowerRight;
        indices[counter++] = lowerLeft;
        //Second triangle:
        indices[counter++] = topLeft;
        indices[counter++] = topRight;
        indices[counter++] = lowerRight;
    }
}

d3dDevice->CreateIndexBuffer(sizeof(DWORD)* total, 0, D3DFMT_INDEX16, 
    D3DPOOL_MANAGED, &groundindex, 0);
void* mem = 0;
groundindex->Lock(0, 0, &mem, 0);
memcpy(mem, indices, total * sizeof (DWORD));
groundindex->Unlock();

delete[] indices;

当我删除此块时,我的程序运行正常。

2 个答案:

答案 0 :(得分:2)

您给出的代码看起来没问题 - 有一点需要注意:counter的初始值不在代码本身中。所以要么你不是从counter = 0开始,要么是其他一些代码在你的indices缓冲区上踩踏。

这就是堆腐败的美妙之处。无法保证错误位于代码中已删除的部分中。它可能只是隐藏代码中其他地方存在的错误。

答案 1 :(得分:0)

int total = widthQuads * heightQuads * 6;
DWORD *indices = new DWORD[totalIdx];

你不应该做“新的DWORD [总计];”这里吗?