C++:glibc 检测到损坏的双链表:0x08f8f148

标签 c++ glibc corrupt

我正在编写一个程序,需要在分隔符“:”处解析 PATH 环境变量。在函数 chop 尝试返回数组之前,一切似乎都正常工作。然后我收到以下错误:“glibc detected ./a.out: corrupted double-linked list: 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;   
}

最佳答案

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

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

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

关于C++:glibc 检测到损坏的双链表:0x08f8f148,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19084974/

相关文章:

C++ cin for 循环没有按预期工作?

c++ - 两种模板示例的区别是什么?

c++ - 这会被认为是糟糕的编程习惯吗?

ubuntu - 将 libc 升级到 2.9 版

mysql - 将 PNG 或 JPG 插入 MySQL 会损坏图像

java - Java 程序中的下载有时会损坏

c# - 从 Unity3d 调用 native DLL 的最佳方法是什么?

c - 针对 musl-gcc 编译 fio 的问题

git - 错误 : Workspace has a . git 存储库,但它似乎已损坏

unix - 执行二进制 : `GLIBCXX_3.4.11' not found