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

Dynamic array allocation in a for loop throws an error

本文关键字:分配 错误 数组 动态 循环 for      更新时间:2023-10-16

我有这个循环:

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]]; 上引发以下内存异常

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

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

感谢

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

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

我不知道在您的系统上sizeof(GL_UNSIGNED_INT)sizeof(GLuint)相比如何,但请检查您的代码中是否存在此类错误。

因为它在以下行引发内存异常:

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

我看到有两件事(与记忆有关)可能会出错:

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

  2. C++的new无法分配足够的内存。这是我从这行代码中看到的唯一其他与内存相关的错误。然而,我看不出错误消息与没有足够的内存分配有关,所以我怀疑这是不是错误消息。

您确实需要进行调试以获得更多信息。

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

添加行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,但我不确定。

问题已解决。。这是之前的new[]调用(在另一个方法中),它的大小不合适,导致了这里的问题。非常感谢你们的帮助!