如果我拨打free(ptr)
?
int* some_function(){
int *p1 = malloc(sizeof(int)*10);
int *p2 = p1;
return p2;
}
int main(){
int *ptr = some_function();
free(ptr);
return 0;
}
答案 0 :(得分:5)
当你这样做时
UICollisionBehavior
你有类似
的东西+----+ +---------------------------------+ | p1 | --> | Memory enough for 10 int values | +----+ +---------------------------------+
然后当你做
int *p1 = malloc(sizeof(int)*10);
你有类似
的东西+----+ | p1 | --\ +----+ \ +---------------------------------+ >--> | Memory enough for 10 int values | +----+ / +---------------------------------+ | p2 | --/ +----+
也就是说,你有两个指向同一个内存的指针。
当您返回int *p2 = p1;
时,您只需复制指针,就像初始化p2
时所发生的情况一样,以及p2
函数中的
main
导致
+-----+ +---------------------------------+ | ptr | --> | Memory enough for 10 int values | +-----+ +---------------------------------+
它有不同的变量,但它们的内容都是相同的,它是初始int *ptr = some_function();
调用返回的指针。
答案 1 :(得分:0)
在some_function
返回时,p1
和p2
具有相同的值,即指向由malloc
返回的内存区域的指针。然后使用return p2
从函数返回该值。此处没有内存泄漏,因为malloc
返回的值是从some_function
返回的。这个值恰好存储在多个局部变量中的事实是无关紧要的。
然后在free(ptr)
中调用main
时,ptr
的值再次是malloc
返回的值,因此内存可以正确释放。
答案 2 :(得分:0)
是
指针是一个变量,其值是内存地址。你需要释放那个内存地址(你实际上释放了一个从该地址开始的块 - free
会处理它),为了做到这一点,你需要传递给free
指针它
你可以有多个指向内存位置的指针,并且,由于调用free
并释放其中一个内存位置,它们现在都将指向自由内存(小心它们)。
答案 3 :(得分:0)
*p1
只是一个地址大小的区域,如果系统使用long作为地址,而long用8个字节描述,则指针使用来自存储区的8个字节。如果你设置
*p2 = p1;
您只是将整数值复制到另一个整数值,该值将指向相同的地址。
例如:
int *p = malloc(3);
只是为了可视化,如果我们的堆存储器从0x0001开始,p将被保留用于保存起始地址,该地址是(0x0001),指向我们的3字节保留存储区。
int *p1 = p;
这个p1值也将指向3字节的存储区,由0x0001地址描述,因此它们将包含相同的值。
使用的总内存: p
为4个字节,p1
为4个字节,p
和p1
的内存为3个字节点。
*ptr = somefunction();
然后,当您将该值返回到外部时,p
和p1
将被释放,因为它们的范围是局部变量。我们只返回0x0001,这是我们的内存起始地址。保留的内存仍然保留。
如果你释放*ptr
,它将释放保留的内存(在0x0001地址处为3个字节),因为它指向它。
在程序存在之前,*ptr
仍会使用一些内存。
在我写这篇文章的时候,@ up-programmer-dude的回答是upvoted,因为他比我想象的更好。