我在这里所做的基本上是加入一些较小的数组(Bx,By和Bz)的全局数组(optimisedMesh)。如您所见,Bx的内容和大小,在b和c循环中设置了By和Bz。完全定义它们后,它们将加入optimisedMesh。
此过程应在每个“ a” for循环中进行。

我发现了两个问题。第一个是当我调用free(Bx)时;一旦完成此数组的使用,调试器将向我返回一个分段错误,我不确定为什么。

第二个发生在“ a” for循环的第二个循环上。在第一个循环上
重新分配似乎可以正常工作,但是第二次它返回0x0地址,这进一步导致了代码中的分段错误。

另外,我省略了By和Bz代码,因为它看起来与Bx完全相同。

谢谢你的时间。

    int* LBxIA = (int*) calloc (1,sizeof(int*));    int* LBxIB = (int*) calloc (1,sizeof(int*)); int* LByIA = (int*) calloc (1,sizeof(int*)); int* LByIB = (int*) calloc (1,sizeof(int*)); int* LBzIA = (int*) calloc (1,sizeof(int*)); int* LBzIB = (int*) calloc (1,sizeof(int*));
    int* LBxFA = (int*) calloc (1,sizeof(int*));    int* LBxFB = (int*) calloc (1,sizeof(int*)); int* LByFA = (int*) calloc (1,sizeof(int*)); int* LByFB = (int*) calloc (1,sizeof(int*)); int* LBzFA = (int*) calloc (1,sizeof(int*)); int* LBzFB = (int*) calloc (1,sizeof(int*));

    Quad** Bx = (Quad**) calloc(1,sizeof(Quad*));

    int maxSize = Math::maxof(xLenght,yLenght,zLenght);
    for(int a = 0; a < maxSize; a++){
        int BxCount = 0; int ByCount = 0; int BzCount = 0;
        Bx = (Quad**) realloc(Bx,sizeof(Quad*));

        for(int b = 0; b < maxSize; b++){
            for(int c = 0; c < maxSize; c++){
                //Bx
                if(a <xLenght && b < yLenght && c < zLenght){
                    if(cubes[a][b][c] != nullptr){
                        if(!cubes[a][b][c]->faces[FACE_LEFT].hidden){
                            if(!LBxIA){
                                LBxIA = new int(c);
                            }else{
                                LBxFA = new int(c);
                            }
                        }else{
                            if(LBxIA && LBxFA){
                                BxCount++;
                                Bx = (Quad**) realloc(Bx, BxCount * sizeof(Quad*));
                                Bx[BxCount - 1] = new Quad(Vector3(a,b,*LBxIA),Vector3(a,b,*LBxFA),Vector3(a,b+1,*LBxIA),Vector3(a,b+1,*LBxFA));
                                LBxIA = nullptr;
                                LBxFA = nullptr;
                            }
                        }
                    }else{
                        if(LBxIA && LBxFA){
                            BxCount++;
                            Bx = (Quad**) realloc(Bx, BxCount * sizeof(Quad*));
                            Bx[BxCount-1] = new Quad(Vector3(a,b,*LBxIA),Vector3(a,b,*LBxFA),Vector3(a,b+1,*LBxIA),Vector3(a,b+1,*LBxFA));
                            LBxIA = nullptr;
                            LBxFA = nullptr;

                        }
                        if(LBxIB && LBxFB){
                            BxCount++;
                            Bx = (Quad**) realloc(Bx, BxCount * sizeof(Quad*));
                            Bx[BxCount-1] = new Quad(Vector3(a+1,b,*LBxIB),Vector3(a+1,b,*LBxFB),Vector3(a+1,b+1,*LBxIB),Vector3(a+1,b+1,*LBxFB));
                            LBxIB = nullptr;
                            LBxFB = nullptr;
                        }
                    }
                }
            }
        }

        optimisedMeshCount += (BxCount + ByCount + BzCount)*sizeof(Quad*);
        optimisedMesh = (Quad**) realloc(optimisedMesh, optimisedMeshCount);
        copy(Bx, Bx + BxCount*sizeof(Quad*), optimisedMesh + (optimisedMeshCount - (BxCount + ByCount + BzCount)*sizeof(Quad*)));
        copy(By, By + ByCount*sizeof(Quad*), optimisedMesh + (optimisedMeshCount - (BxCount + ByCount + BzCount)*sizeof(Quad*)) + BxCount*sizeof(Quad*));//TODO Aquí error
        copy(Bz, Bz + BzCount*sizeof(Quad*), optimisedMesh + (optimisedMeshCount - (BxCount + ByCount + BzCount)*sizeof(Quad*)) + BxCount*sizeof(Quad*) + ByCount*sizeof(Quad*));
        free(Bx);
    }

最佳答案

我猜,问题出在三行copy行上。

copy期望某些容器或内存范围的开始和结束。在您的情况下,您可以提供Bx(这很好)和Bx + BxCount*sizeof(Quad*)(这超出了Bx内存的末尾)。

这是因为Bx + 1不是Bx + 1个字节,而是&Bx[1],它是第二个元素。同样,Bx + BxCount将是copy预期的“结尾”。

这意味着,在64位系统上,Bx + BxCount*sizeof(Quad*)超出了Bx内存范围末尾的八倍。 optimisedMeshByBz也是如此。结果,您复制了太多的元素,结果导致内存损坏。



使用std::vector并存储Quad而不是指向Quad的指针

std::vector<Quad> Bx, By, Bz, optimisedMesh;
for (int a = 0; a < maxSize; a++) {
    Bx.clear();
    for (int b = 0; b < maxSize; b++) {
        for (int c = 0; c < maxSize; c++) {
            // ...
            Quad qx(Vector3(a,b,*LBxIA),
                   Vector3(a,b,*LBxFA),
                   Vector3(a,b+1,*LBxIA),
                   Vector3(a,b+1,*LBxFA));
            Bx.push_back(qx);
            // ...
        }
    }

    std::copy(Bx.begin(), Bx.end(), std::back_inserter(optimizedMesh));
    std::copy(By.begin(), By.end(), std::back_inserter(optimizedMesh));
    std::copy(Bz.begin(), Bz.end(), std::back_inserter(optimizedMesh));
}


如您所见,没有显式分配,重新分配或释放内存,也没有计数元素。



无关,但您还必须注意LBxIA = new int(c);LBxIA = nullptr;,它们会泄漏内存。

10-08 16:52