malloc由_int_malloc导致分段错误
发布时间:2020-12-16 07:35:04 所属栏目:百科 来源:网络整理
导读:我有一个树结构,我也添加了大量的节点.执行此操作的次数(在运行之间清除树)和节点数作为命令行参数给出.对于节点数大致 6000和程序按预期执行的任意数量的运行.但是,当节点数超过此数并且运行次数超过50左右时,程序会导致分段错误. Program received signal
我有一个树结构,我也添加了大量的节点.执行此操作的次数(在运行之间清除树)和节点数作为命令行参数给出.对于节点数大致< 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. 使用回溯跟踪这个跟踪 #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 注意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----------------------------------------"); } } 我用来释放树的代码如下,它在根节点上调用,当树是叶子时内部标志设置为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); } } 树结构看起来像这样 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; }; 将Bodys添加到树中的代码如下,addBodyToCorrectQuad在正文所在的四边形上调用addBody. 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("Bn"); } else{ (*tree)->internal = 1; / addQuadsToTree(tree); //printf("%f",((*tree)->NW)->quad.x); addBodyToCorrectQuad((*tree)->body,tree); (*tree)->body = combineBody((*tree)->body,tree); //printf("Cn"); } } } 解决方法
在某处有堆损坏 – 有人在数组的末尾运行或取消引用无效指针或在释放后使用某个对象.
尝试使用valgrind或其他一些内存调试工具来缩小问题所在. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |