我有这个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]
个值。 (我已经检查了这个)。如何在这样的循环中正确删除动态数组。
由于
答案 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]];
我发现有两个(与记忆相关的)可能出错的事情:
indexCount中的超出范围访问权限。您确定已为indexCount分配了空间吗?这个异常抛出时你确定它的大小大于l吗?尝试调试和检查以确保indexCount不为null,并且在抛出异常之前l不大于indexCount的大小。看看它是在for循环的第一次迭代中还是在中间迭代中抛出。
C ++的new
无法分配足够的内存。这是我从这行代码中可以看到的唯一其他与内存相关的错误。但是,我没有看到错误消息与没有足够的内存分配相关的任何方式,所以我怀疑它是这个。
您确实需要调试以获取更多信息。
答案 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[]
调用(在另一种方法中)没有适当的大小,这导致了这里的问题。非常感谢你的帮助!