malloc provoquant faute de segmentation par _int_malloc

J'ai une structure de l'arbre dont je suis l'ajout d'une grande quantité de nœuds. Le nombre de fois que cela est fait (arbre nettoyé entre les courses) et le nombre de nœuds est donné comme argument de ligne de commande. Pour les nombres de nœuds à peu près < 6000 et un certain nombre de pistes, le programme s'exécute comme prévu. Toutefois, lorsque le nombre de nœuds dépasse cette et le nombre de points dépasse un faible nombre de l'ordre de 50 le programme provoque une erreur de segmentation.

    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.

À l'aide de trace de cette les pistes trop

#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

Noter que le addBody -> addBodyToCorrectQuad -> addBody la récursivité se produit, un grand nombre de fois au nombre élevé de nœuds. Le code avec la fonction malloc qui échoue est ci-dessous.

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----------------------------------------");
    }
}

Le code que j'utilise pour libérer de l'arbre est comme suit, étant appelé le nœud racine de l'intérieur et le drapeau a été mis à 0 lorsque l'arbre est une feuille.

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);
    }
}

L'arbre struct ressemble à ceci

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;
};

Le code pour ajouter des Bodys à l'arbre est comme suit, avec addBodyToCorrectQuad appel addBody sur le quad, que le corps n'existe plus à l'intérieur.

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");
        }
    }
}
On dirait que vous êtes en train de modifier libéré bloque quelque part. Mais c'est difficile à dire sans avoir plus de code. Pourriez-vous s'il vous plaît ajouter le code où vous gratuitement à votre liste?
Parmi les nombreuses choses malloc() ne pour satisfaire ses demandes de mémoire interne libre-liste(s) sont souvent énumérés pour meilleur ajustement des allumettes, etc. Je soupçonne fortement au moins l'un de vos avant dotations par la suite libéré avant cette délinquance malloc() outrepasse ses affectation des bornes et le grillage de la liste libre. Mettre des gardes sur les deux côtés de votre structure (une valeur DWORD valeur constante comme 0xBA53BA11 devrait suffire " et dur de panique si vous jamais rencontre un bloc sur le point d'être libéré avec les gardes écrasé.
Quelque chose est gâcher votre tas. Sans le programme complet, il est impossible de savoir à quoi/où (vous voyez la victime d'une version antérieure à griffonner sur la mémoire, il n'y a aucun moyen de savoir quand/où). Exécuter votre programme sous valgrind, et vérifier sa sortie avec soin. Vérifiez que le programme ne suivre la vie de chaque zone allouée avec précision. Vérifiez qu'il n'a pas d'étape sur les limites des zones (off-by-one des erreurs dans l'index de tableau, copie de trop longues chaînes de caractères, ...).
J'ai ajouté le code pour le nettoyage et l'ajout d'organes, espérons que cette aide
Juste pour l'humour, ajouter *tree = NULL après chaque free(*tree); dans cleanTree(), et ajouter if(!tree || !*tree) exit(EXIT_FAILURE); au début de la même fonction avant tout de ce code. En essayant d'attraper un faux arbre pointeur ici. Un code similaire dans addBody() serait probablement justifiée. Enfin supprimer le (Tree*) cast sur votre malloc() appels et vérifier les avertissements du compilateur avec soin pour une "hypothèse de rendement int messages" sur ces emplacements. Dans le processus, vérifiez que vous êtes, y compris <stdlib.h> dans vos fichiers source.

OriginalL'auteur John LA | 2013-02-11