Перераспределение памяти вызывает ошибку сегментации в цикле

То, что я здесь делаю, — это в основном объединение с глобальным массивом (optimisedMesh) некоторых меньших массивов (Bx, By и Bz). Как вы можете видеть, содержание и размер Bx, By и Bz установлены в циклах b и c. Как только они полностью определены, они присоединяются к optimisedMesh.
Этот процесс должен происходить каждый цикл «а».

Я обнаружил две проблемы, пытаясь это сделать. Во-первых, когда я звоню бесплатно (Bx); как только я закончил нуждаться в этом массиве, отладчик возвращает мне ошибку сегментации, я не уверен почему.

Второе происходит во втором цикле цикла «а». На первой петле
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);
}

0

Решение

Я думаю, проблема с тремя copy линий.

copy ожидает начало и конец некоторого контейнера или диапазона памяти. В вашем случае вы предоставляете Bx, что хорошо, и Bx + BxCount*sizeof(Quad*)что далеко за пределами конца Bx объем памяти.

Это потому что Bx + 1 не является Bx +1 байт, но &Bx[1], который является вторым элементом. В равной степени, Bx + BxCount будет «конец», как и ожидалось copy,

Это означает Bx + BxCount*sizeof(Quad*) в 64-битной системе, в восемь раз больше, чем конец Bx диапазон памяти. То же самое касается optimisedMesh, By а также Bz, Как следствие, вы копируете слишком много элементов и в результате получаете повреждение памяти.


С помощью std::vector и хранение Quads вместо указателей на 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;, который утечки памяти.

3

Другие решения

Других решений пока нет …