Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ for循环中的动态数组分配引发错误_C++_Opengl_Memory Management - Fatal编程技术网

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

C++ for循环中的动态数组分配引发错误,c++,opengl,memory-management,C++,Opengl,Memory Management,我有一个循环: 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; } 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;
}
for(int l=0;l
(可以在此处找到完整的代码片段:)

出于某种原因,这会在
GLuint*index=newgluint[indexCount[l]]处引发以下内存异常

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

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


谢谢,因为它在下面的行中抛出了一个内存异常:

GLuint* indices = new GLuint[indexCount[l]];
我发现有两件(与记忆相关的)事情可能会出错:

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

  • C++的
    new
    无法分配足够的内存。这是我从这行代码中看到的唯一一个与内存相关的错误。然而,我不认为错误消息与没有足够的内存分配有关,所以我怀疑它是否是这个

  • 您确实需要调试以获得更多信息

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

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

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GL_UNSIGNED_INT) * indexCount[l], indices, GL_STATIC_DRAW);
    
    我不知道系统上的
    sizeof(GL\u UNSIGNED\u INT)
    sizeof(GLuint)
    相比如何,但请检查您的代码中是否存在此类错误


    添加行
    std::cout问题已解决。。这是以前的
    新[]
    调用(在另一种方法中)大小不正确,导致了这里的问题。非常感谢你们的帮助

    (2*patch\u size\u level+1)*(patch\u size\u level-1)
    的值是多少?查找超出范围的索引,它有时可能会导致一些奇怪的错误。为什么不直接使用
    std::vector
    ?添加行
    std::cout 44>1414@KennyTM没有特别的原因,除了我对std库最基本的功能都不太熟悉。它在
    l=0时抛出异常,我确实为indexCount分配了内存(参见要点)。作为对您其他评论的回答:1)indexCount在被访问时不为空。2) 否,在
    l=0时。3) 这是非常随机的,但它在该行或
    delete[]index
    行给出了一个SIGABRT。有时它确实起作用,似乎是随机的。4) 见第2段)。我真的看不出还有什么其他的问题,虽然…修复了,但不幸的是不是问题。我在最外层的循环底部添加了这个。(仅在删除索引[]上方)。对于更高的级别,我以2的幂递增计数器,因此我不会对这些计数器执行循环次数
    (patch_size*(patch_size-1))
    。对于可能的最低级别,我们有
    (patch\u size\u level-1)*(patch\u size\u level*2+1)增量
    ,因为
    l=0的
    patch\u size\u level
    只是
    patch\u size
    我们有
    (patch\u size-1)*(2*patch\u size+1)
    。此外,patch\u size的形式应该是$2^n+1$。我目前正在用65.PS进行测试:对于那些感兴趣的人来说,这个方法是一个开源游戏引擎的一部分,可以在这里找到并定期更新。注意:这正是大多数C++用户建议使用<代码> STD::vector < /COD>而不是直接<代码> NeX[]/COD>调用的原因。你不会弄错的。
    patch_size=64
    level_max=5
    patch_size_level=33
    indexCount[0]=2144