C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了malloc由_int_malloc导致分段错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个树结构,我也添加了大量的节点.执行此操作的次数(在运行之间清除树)和节点数作为命令行参数给出.对于节点数大致< 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("B\n");
        }
        else{
            (*treE)->internal = 1;   /
            addQuadsToTree(treE);
            //printf("%f",((*treE)->NW)->quad.X);
            addBodyToCorrectQuad((*treE)->body,treE);
            (*treE)->body = combineBody((*treE)->body,treE);
            //printf("C\n");
        }
    }
}

解决方法

在某处有堆损坏 – 有人在数组的末尾运行或取消引用无效指针或在释放后使用某个对象.

尝试使用valgrind或其他一些内存调试工具来缩小问题所在.

大佬总结

以上是大佬教程为你收集整理的malloc由_int_malloc导致分段错误全部内容,希望文章能够帮你解决malloc由_int_malloc导致分段错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。