好的,所以我有一个方法,我打电话。被调用的方法返回char*
,它在被调用的方法中分配。将返回的char*
分配给新的char*
后,我想在使用后将其释放。但Xcode抱怨并抛出错误。它说我试图释放的对象没有分配,我没有得到,因为我确定我已经分配了它。
这是我的代码:
void print_r()
{
char *stateA = isActive(ruter_array[id]->flagg);
//print out the results etc
free(stateA); <-----The program crashes here.
}
char * isActive(unsigned char a_flag)
{
char *ret = malloc(5);
if((a_flag & 1) == 1)
{
//is active
ret = "yes";
return ret;
}
ret = "no";
return ret;
}
了解这是什么并不重要,但为什么这次崩溃会崩溃?
答案 0 :(得分:3)
ret = "no";
覆盖指针。改为:
strcpy(ret, "no");
同样适用于"yes"
案例。
另外,正如@DavidSchwartz指出的那样,为了您的目的,可能没有必要使用动态分配的内存。可以直接返回字符串文字:
char * isActive(unsigned char a_flag)
{
if((a_flag & 1) == 1)
{
//is active
return "yes";
}
return "no";
}
当然,在这种情况下,来电者不应该free
返回的值。
答案 1 :(得分:2)
您分配了一些内存并将该内存的第一个地址分配给指针ret
,但"no"
和"yes"
是在编译时静态存储在内存中的字符串文字。执行ret = "no"
时,更改指针,使其现在指向字符串文字"no"
的第一个字符。所以,现在你已经失去了对你分配的内存的访问权限,并且你有内存泄漏。但崩溃是因为你试图释放未被malloc()
或其中一个朋友分配的内存。
答案 2 :(得分:1)
您甚至可以使用strdup
:
char * isActive(unsigned char a_flag)
{
return strdup((a_flag & 1) == 1 ? "yes" : "no");
}
如写here,指针仍然通过malloc
分配,因此它也可以被释放。