我有一个全局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 */
}