【问题标题】:C++: glibc detected corrupted double-linked list: 0x08f8f148C++:glibc 检测到损坏的双链表:0x08f8f148
【发布时间】:2013-10-05 18:29:35
【问题描述】:

我正在编写一个程序,它需要在分隔符“:”处解析 PATH 环境变量。一切似乎都在正常工作,直到函数 Chop 尝试返回数组。然后我收到以下错误:“glibc检测到./a.out:损坏的双链表:0x08f8f148”。我使用chop来解析用户输入并且它工作正常。非常感谢任何帮助。

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

【问题讨论】:

标签: c++ glibc corrupt


【解决方案1】:

我不知道您是否注意到了这一点,但您正在创建一个指针数组,指向具有函数局部范围的std::string 对象x 中的位置。一旦这个函数返回,这些指针并不能保证是有意义的,因为x 将被销毁。

您正在为切碎的单词的指针数组分配持久存储,但未能确保它们指向的内容的生命周期比函数本身长。如果您引用这些指针中的任何一个,它将是未定义的行为,只是可能是您的链接列表损坏的原因。

即使这不是您的问题的原因,这仍然是一个需要解决的错误。几乎看起来您改编了一个基于 C 的 chop (...) 函数,该函数在 char * 上运行,并将其替换为 std::string,但没有意识到当字符串对象超出范围时会发生什么。

【讨论】:

    【解决方案2】:

    我在一些代码中遇到了这个错误,其中有人在一个线程中调用 exit() 与 main() 返回的时间差不多,导致全局/静态构造函数在两个线程中运行。

    此错误还表现为double free or corruptionexit()malloc_consolidate 内部的 segfault/sig11,以及可能的其他错误。

    在 valgrind 下运行时,问题从未出现过。

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 1970-01-01
      • 2013-12-05
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多