我正在编写一个需要在分隔符“:”处解析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;
}
答案 0 :(得分:1)
我不知道您是否注意到了这一点,但是您正在创建一个指向std::string
对象x
中具有功能本地范围的位置的指针数组。一旦这个函数返回,那些指针就不能保证有意义,因为x
将被销毁。
您正在为切词的指针数组分配持久存储,但未能确保它们指向的内容的寿命比函数本身的寿命更长。如果您引用这些指针中的任何一个,那么它将是未定义的行为,只是可能是链接列表损坏的原因。
即使它不是您的问题的原因,这仍然是一个需要解决的错误。几乎看起来你修改了一个基于C的chop (...)
函数,该函数在char *
上运行,并用std::string
替换它,没有意识到当一个字符串对象超出范围时会发生什么。
答案 1 :(得分:0)
我在某些代码中遇到了这个错误,其中有人在返回main()
的同时在一个线程中调用exit(),导致全局/静态构造函数在两个线程中运行。
此错误也会显示为double free or corruption
,exit()
内或malloc_consolidate
内的段错误/ sig11,以及其他错误。
在valgrind下运行时,问题从未出现过。