c-munmap_chunk()在释放分配的内存时出错



我有一个全局char* path,稍后我调用一个分配内存并返回内存的函数,路径指向它,当我释放它时,我会得到这个错误

唯一的方法是不释放指针

void free_memory() {
if(path!=NULL)
free(path);//problem
}
char* ExtractPath(char*str)
{
char*temp=(char*)malloc(sizeof(char)*(strlen(str))+1);
bzero(temp,strlen(temp));
char ch ='/';
if( checkUrl(str)==1) {
if(strncasecmp(str,"http://",7)==0)
str+=7;
if(strstr(str,"/")!=NULL)
{
strcpy(temp,str);
temp=strchr(temp,ch);
strtok(temp,"t");
}
else
strcpy(temp,"/");
}
return temp;
}
path=ExtractPath(Users_input);//here the pointer points to the allocated memory that returned from the function the char*path is a global value

正如我所看到的,问题出在上

bzero(temp,strlen(temp));

temp的内容是不确定的,将其传递给strlen()将调用未定义的行为。

引用C11,第7.22.3.4章

malloc函数为大小由size和其值是不确定的

也就是说,关于free()部件的错误,您必须提供malloc()或系列返回的精确指针。

引用章节§7.22.3.3

[…]否则,如果参数与内存管理先前返回的指针不匹配函数,或者如果调用free或realloc已释放空间,则行为未定义。

在您的代码中,您实际上通过说来修改存储在temp中的原始指针

temp=strchr(temp,ch);
strtok(temp,"t");

并返回"修改后"的temp

temp传递给free()将再次导致未定义的行为。

由于ExtractPath不返回从malloc返回的值,因此无法释放返回的字符串。只有将您从malloc返回的值精确地传递给free才是合法的。

执行temp=strchr(temp,ch);后,从malloc返回的原始值将丢失。对strchr返回的值调用free是不合法的。

这里有一种解决方法:

char* ExtractPath(char*str)
{
char* temp=(char*)malloc(sizeof(char)*(strlen(str))+1);
char* orig = temp; /* save the value we got back from malloc */
char* ret;
char ch ='/';
if( checkUrl(str)==1) {
if(strncasecmp(str,"http://",7)==0)
str+=7;
if(strstr(str,"/")!=NULL)
{
strcpy(temp,str);
temp=strchr(temp,ch);
strtok(temp,"t");
}
else
strcpy(temp,"/");
}
ret = malloc (strlen(temp) + 1);
strcpy(ret, temp); /* make a new copy to return */
free(orig); /* pass what malloc returned to free */
return ret; /* caller can free this since we got it back from malloc */
}

相关内容

  • 没有找到相关文章

最新更新