是一个快速而简单的问题。我没有在stackoverflow中找到它,所以如果已经问过,我很抱歉。
当我开始想知道如何自由工作时,我正在为我的BST(我正在学习)做一个删除功能。 free知道必须释放多少内存以及它在哪里,因为内存块包含该信息。但是,什么指针必须获得免费?
例如在此代码中:
....
NODE* original,copy; //NODE is a struct.
NODE** copy2;
original=(NODE*)Malloc(sizeof(NODE));
copy=original;
copy2=&original;
free(copy)
....
我相信是这样的:
copy2---->original------>[memory block] <---------copy
我怀疑是下一个:
无论哪个指针传递给free,内存块都会被释放?
所以我能做到:
free(original)
free(copy)
free(*copy2)
并且是一样的吗?
对不起任何语法错误,我的英语很差。
谢谢!
答案 0 :(得分:3)
这个
copy=original;
仅仅是指针的分配。您将内存块的地址从一个变量复制到另一个变量,如下所示:
[.........memory block.........] <- You are freeing this NOT the pointer
|
copy
original
现在你也可以免费 - 你会得到相同的结果。
答案 1 :(得分:2)
free(original)
free(copy)
free(*copy2)
是的,那些都完全一样。在执行其中任何一个之后,original
和copy
都是无效指针。 copy2
仍然是指向original
的有效指针,但*copy2
不是有效指针。
与某些语言不同,C会不跟踪有多少指针引用内存中的特定位置。因此,当您在任何一个指针上调用free
时,内存将被释放,并且所有指针都将无效。
答案 2 :(得分:1)
free()
期望指针用于malloc()
calloc()
realloc()
不是将相同的指针传递给free(),而是使用中间指针copy
传递同一地址的副本。
所以它类似于free(original)
。
指针可能指向的位置是由分配空间的操作系统维护的内存记录,在释放时使用