【发布时间】:2017-11-21 00:10:52
【问题描述】:
我在这里所做的基本上是将一些较小的数组(Bx、By 和 Bz)加入到全局数组(优化网格)中。如您所见,Bx、By 和 Bz 的内容和大小设置在 b 和 c 循环上。一旦它们被完全定义,它们就会加入到优化网格中。 这个过程应该在每个“a” for 循环中发生。
我在尝试这个时发现了两个问题。第一个是当我调用 free(Bx);一旦我完成了对这个数组的需求,调试器就会返回一个分段错误,我不知道为什么。
第二个发生在“a”for 循环的第二个循环上。在第一个循环 realloc 似乎工作正常,但第二次它返回 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);
}
【问题讨论】:
-
混合内存分配器如何工作,例如:
int* LBxIA = (int*) calloc (1,sizeof(int*));和后来的LBxIA = new int(c);?我还看到了对new的调用,而没有对delete的调用。正如@MichaelBurr 建议的那样,您可以将其中大部分替换为std::vector -
在这种情况下,使用像 valgrind 这样的内存检查器会非常有帮助。对于您的实际问题,复制语句中的指针算法似乎是错误的;向 optimisedMesh 添加一个数字不会以字节为单位增加指针,而是以“Quad”为单位。无论如何,你为什么不使用
std::vector进行内存管理呢? -
你试过在 valgrind 下运行吗?您是否考虑过使用
vector<>为您处理所有这些动态分配以用于增长的数组? -
另外,在
copy(Bx, Bx + BxCount*sizeof(Quad*)中,如果指向的对象--p+1没有指向p之后的一个字节,则添加的指针和数字已经按大小缩放,但是p之后的一个对象。你真的想在这里再扩展一次吗?
标签: c++ arrays malloc realloc calloc