我试图了解 free 的工作原理。
标准中是否定义了 free()
不会更改它传递的指针?
最佳答案
在标准 C 参数中,参数传递是按值传递的。因此,函数无法更改其参数的值(这不是 free
特有的)。每个电话都是call by value 。如果在函数内部更改某些参数,则仅更改该参数的本地副本(例如在某些机器寄存器中),并且调用者看不到任何更改。
如果您想更改某些内容,您将将该内容的地址作为值传递,然后取消引用该指针。
因此,free
不会更改您传递给它的指针,但您需要确保不再使用该指针。否则就是undefined behavior 。常见的风格是编写 free(ptr), ptr=NULL;
代码(这样通过 ptr
进行的任何进一步访问都会崩溃,并显示 segmentation fault )。
实际上,C standard library 的大多数实现正在标记一个 free
-d 区域,以便将来的 malloc
可以重用。但有时(特别是在释放大内存区域时)内存会被释放给内核(例如,在 Linux 上通过 munmap(2) )。内存区域真正发生的情况是特定于实现的。
阅读 C dynamic memory allocation 的维基页面& virtual address space .
还可以查看一些 free software 的源代码C 标准库实现(例如 Linux 上的大多数 libc
,如 musl-libc 或 GNU libc ...)。使用所有警告和调试信息编译代码(例如,如果使用 GCC ...,则使用 gcc -Wall -Wextra -g
),然后使用 valgrind狩猎memory leak错误。
关于c - free() 不应该接受 (void *const) 作为输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860072/