for循环中的动态数组分配会引发错误

时间:2012-02-26 10:13:41

标签: c++ opengl memory-management

我有这个for循环:

for(int l = 0; l < level_max; ++l) {
    //...
    indexCount[l] = (2*patch_size_level+1) * (patch_size_level - 1);
    GLuint* indices = new GLuint[indexCount[l]];
    //... (for loops in which I fill indices)
    delete[] indices;
}

(可在此处找到完整的代码段:https://gist.github.com/1915777

由于某种原因,这会在GLuint* indices = new GLuint[indexCount[l]];

处引发以下内存异常
  

对象0x1028cd408的演示(12783,0x7fff7367e960)malloc: * 错误:   释放对象的校验和不正确 - 可能修改了对象   被释放后。

我做错了什么?我没有为我的索引数组分配超过indexCount[l]个值。 (我已经检查了这个)。如何在这样的循环中正确删除动态数组。

由于

4 个答案:

答案 0 :(得分:1)

可能不相关,但此行上可能存在读取缓冲区溢出:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GL_UNSIGNED_INT) * indexCount[l], indices, GL_STATIC_DRAW);

我不知道sizeof(GL_UNSIGNED_INT)与您系统上sizeof(GLuint)的比较,但请查看您的代码以了解此类错误。

答案 1 :(得分:0)

因为它在以下行中抛出了一个内存异常:

GLuint* indices = new GLuint[indexCount[l]];

我发现有两个(与记忆相关的)可能出错的事情:

  1. indexCount中的超出范围访问权限。您确定已为indexCount分配了空间吗?这个异常抛出时你确定它的大小大于l吗?尝试调试和检查以确保indexCount不为null,并且在抛出异常之前l不大于indexCount的大小。看看它是在for循环的第一次迭代中还是在中间迭代中抛出。

  2. C ++的new无法分配足够的内存。这是我从这行代码中可以看到的唯一其他与内存相关的错误。但是,我没有看到错误消息与没有足够的内存分配相关的任何方式,所以我怀疑它是这个。

  3. 您确实需要调试以获取更多信息。

    • 当indexCount被访问时(抛出异常时)为null
    • 异常是否抛出for循环的第一个值或中间值
    • 异常是否真的抛出那条特定的行?
    • 检查indexCount的大小以及分配它的位置,并确保l不大于此大小。

答案 2 :(得分:0)

  

添加行std::cout << current_index << " " << (2*patch_size_level+1) * (patch_size_level - 1) << std::endl;结果   在以下输出中:

你在哪里添加这条线? IME current_index在崩溃前达到8126,indexCount[l]正如您的情况一样,2144。这就是我们所拥有的:

patch_size=64
level_max=5
patch_size_level=33
indexCount[0]=2144

但你执行内循环(patch_size * (patch_size-1))次,即4032,每个内循环你增加两个current_index,这给我们超过8000。

你可能在某些时候混淆了patch_size和patch_size_level,但我不确定。

答案 3 :(得分:0)

问题已经解决..这是一个先前的new[]调用(在另一种方法中)没有适当的大小,这导致了这里的问题。非常感谢你的帮助!