2013-09-30 8 views
0

J'écris un programme qui doit analyser la variable d'environnement PATH à un délimiteur ":". Tout semble fonctionner correctement jusqu'à ce que la fonction coupe essaye de retourner le tableau. Je reçois alors l'erreur suivante: "glibc détecté ./a.out: liste double-liée corrompue: 0x08f8f148". J'utilise le chop pour analyser aussi les entrées utilisateur et cela fonctionne correctement. Toute aide est grandement appréciée.C++: liste double-liée corrompue détectée par la glibc: 0x08f8f148

//Parse environment variable 
    char const* pPath = getenv("PATH"); 
    if (pPath == NULL){;} 
    else{ 
     string ePath(pPath); 
     envp = chop(ePath,':'); 
    } 

char **chop(string s, char c){ 
    int i, j, k, len, words = 0; 
    len = s.length(); 
    //determine # of words 
    for(i=0;i<len+1;i++){ 
     if(s[i] == c || s[i] == '\0'){words++;} 
    } 
    char **array; 
    string x; 
    //allocate memory for char pointers 
    if((array=(char**)malloc((words+1)*sizeof(char*))) == NULL){return NULL;} 
    array[0] = &x[0]; 
    i = 0; k = 0; 
    //split string on char c 
    for(j = 1; j < (words+1); j++,k++,i++){ 
     //read in characters until delimiter 
     while (s[k] != c && s[k] != '\0'){ 

      x[i] = s[k]; 
      i++; k++; 
     } 
     x[i] = '\0'; 
     array[j] = &x[i+1]; 
    } 
    array[j] = 0; 
    return array; 
} 
+0

L'erreur n'est pas dans le code que vous avez montré. Très probablement, vous supprimez quelque chose deux fois. –

+0

duplicata possible de [Qu'est-ce qu'une erreur glibc libre/malloc/realloc invalide taille suivante/pointeur invalide et comment y remédier?] (Http://stackoverflow.com/questions/23680334/what-is-a-glibc-free -malloc-realloc-invalide-next-size-invalide-pointeur-erreur-et) – PlasmaHH

Répondre

1

Je ne sais pas si vous avez remarqué ou non, mais vous créez un tableau de pointeurs vers des emplacements dans un objet std::stringx qui a la portée de la fonction locale. Dès que cette fonction revient, ces pointeurs ne sont pas garantis, car x sera détruit.

Vous allouez un stockage persistant pour la matrice de pointeurs pour les mots coupés, mais vous ne parvenez pas à garantir que la durée de vie de ces éléments est plus longue que la fonction elle-même. Si vous référencez l'un de ces pointeurs, ce sera un comportement indéfini, ce qui peut être à l'origine de la corruption de votre liste liée (seulement).

Même si ce n'est pas la cause de votre problème, c'est toujours une erreur qui doit être corrigée. Il semble presque que vous ayez adapté une fonction chop (...) basée sur C qui a fonctionné sur char * et l'a remplacée par std::string sans savoir ce qui se passe lorsqu'un objet de chaîne sort de sa portée.

0

J'ai rencontré cette erreur dans un code où quelqu'un appelait exit() dans un thread à peu près au même moment que main(), provoquant l'exécution de constructeurs globaux/statiques dans les deux threads.

Cette erreur se manifeste également en tant que double free or corruption, un segfault/sig11 à l'intérieur exit() ou à l'intérieur de malloc_consolidate, et probablement d'autres.

Le problème ne s'est jamais présenté lors du fonctionnement sous valgrind.

Questions connexes