2013-09-30 89 views
0

我正在寫一個程序,需要解析PATH環境變量的分隔符「:」。一切似乎都正常工作,直到函數chop嘗試返回數組。然後我收到以下錯誤:「檢測到glibc ./a.out:損壞的雙鏈表:0x08f8f148」。我使用印章也分析用戶輸入,它工作正常。任何幫助是極大的讚賞。C++: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

錯誤不在您顯示的代碼中。最有可能的是你刪除了兩次。 –

+0

可能重複[什麼是glibc免費/ malloc/realloc無效的下一個大小/無效指針錯誤,以及如何解決它?](http://stackoverflow.com/questions/23680334/what-is-a-glibc-free -malloc-realloc的-無效-下一尺寸無效指針誤差和) – PlasmaHH

回答

1

我不知道你有沒有注意到這一點或沒有,但你正在創建的指針數組位置的std::string對象x有函數局部範圍內。只要這個函數返回,這些指針不保證有意義,因爲x將被銷燬。

您正在爲切碎的單詞的指針數組分配永久存儲,但未能確保它們指向的內容比函數本身的壽命更長。如果你引用任何這些指針,它將是未定義的行爲,其中只是可能是你的鏈表損壞的原因。

即使它不是你的問題的原因,這仍然是一個需要解決的錯誤。它幾乎看起來像是改編了一個基於C的chop (...)函數,該函數在char *上運行,並用std::string代替它,但沒有意識到字符串對象超出範圍時會發生什麼情況。

0

我在一些代碼中遇到了這個錯誤,其中有人在一個線程中調用exit()的時間大約與main()返回時相同,導致全局/靜態構造函數在兩個線程中都運行。

該錯誤還表現爲double free or corruptionexit()內部的段錯誤/ sig11或malloc_consolidate以及其他可能的錯誤。

在valgrind下運行時,問題從未出現過。