malloc通过_int_malloc导致分段错误

Joh*_* LA 5 c malloc segmentation-fault

我有一个树形结构,我也添加了很多节点。完成此操作的次数(两次运行之间清除的树)和节点数作为命令行参数给出。对于大约<6000的节点数量和任意数量的运行,程序将按预期执行。但是,当节点数超过此数目并且运行次数超过50左右的低数目时,程序将导致分段错误。

    Program received signal SIGSEGV, Segmentation fault.
    _int_malloc (av=0x7ffff7201740 <main_arena>, bytes=112) at malloc.c:3570
    3570    malloc.c: No such file or directory.
Run Code Online (Sandbox Code Playgroud)

使用回溯也跟踪

#0  _int_malloc (av=0x7ffff7201740 <main_arena>, bytes=112) at malloc.c:3570
#1  0x00007ffff6ecbfb5 in __GI___libc_malloc (bytes=112) at malloc.c:2924
#2  0x0000000000401a99 in createTreeForQuad (quad=...) at cs257.c:217
#3  0x0000000000401b3a in addQuadsToTree (tree=tree@entry=0x2f965c8) at cs257.c:230
#4  0x0000000000401dec in addBody (tree=tree@entry=0x2f965c8, body=...) at cs257.c:292
#5  0x0000000000402146 in addBodyToCorrectQuad (body=..., tree=tree@entry=0x2f961c8) at cs257.c:245
#6  0x0000000000401eaf in addBody (tree=tree@entry=0x2f961c8, body=...) at cs257.c:296
#7  0x0000000000402146 in addBodyToCorrectQuad (body=..., tree=tree@entry=0x2f95dc8) at cs257.c:245
Run Code Online (Sandbox Code Playgroud)

请注意,addBody-> addBodyToCorrectQuad-> addBody递归在大量节点上发生多次。malloc失败的代码如下。

Tree *createTreeForQuad(Quad quad) {
Tree *tree;
tree = (Tree *)malloc(sizeof*tree);
if (tree != NULL){
    tree->quad = quad;
    tree->internal = 0;
    tree->bodyEmpty = 1;
    return tree;
}else{
   printf("\n ------------------------------------ MALLOC FAILED----------------------------------------");
    }
}
Run Code Online (Sandbox Code Playgroud)

我用来释放树的代码如下,当树是叶时,在根节点上调用它,并将内部标志设置为0。

void cleanTree(Tree **tree) {
    if((*tree)->internal == 0) {
        free(*tree);
    }
    else{
        cleanTree(&((*tree)->NE));
        cleanTree(&((*tree)->SE));
        cleanTree(&((*tree)->SW));
        cleanTree(&((*tree)->NW));
        cleanTree(&((*tree)->NE1));
        cleanTree(&((*tree)->NW1));
        cleanTree(&((*tree)->SE1));
        cleanTree(&((*tree)->SW1));
        free(*tree);
    }
}
Run Code Online (Sandbox Code Playgroud)

树结构看起来像这样

typedef struct Tree Tree;
struct Tree {
    Body body;
    Quad quad;
    Tree *NE;
    Tree *NW;
    Tree *SE;
    Tree *SW;
    Tree *NE1;
    Tree *NW1;
    Tree *SE1;
    Tree *SW1;
    int internal;
    int bodyEmpty;
};
Run Code Online (Sandbox Code Playgroud)

用于将Body添加到树中的代码如下,addBodyToCorrectQuad调用addBody该body存在于其中的四边形。

void addBody(Tree **tree, Body body) {
   if( (*tree)->bodyEmpty == 1) { 
        (*tree)->body = body;
        (*tree)->bodyEmpty = 0;
    }
    else {
        if((*tree)->internal) {
            (*tree)->body = combineBody((*tree)->body, body);
            addBodyToCorrectQuad(body, tree);
            //printf("B\n");
        }
        else{
            (*tree)->internal = 1;   /
            addQuadsToTree(tree);
            //printf("%f",((*tree)->NW)->quad.x);
            addBodyToCorrectQuad((*tree)->body, tree);
            (*tree)->body = combineBody((*tree)->body, body);
            addBodyToCorrectQuad(body, tree);
            //printf("C\n");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 4

你在某个地方发生了堆损坏——有人在数组末尾运行,或者取消引用无效的指针,或者在释放某个对象后使用它。

尝试使用valgrind或其他内存调试工具来缩小问题的范围。