c - free() 不应该接受 (void *const) 作为输入参数

标签 c pointers free

我试图了解 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-libcGNU libc ...)。使用所有警告和调试信息编译代码(例如,如果使用 GCC ...,则使用 gcc -Wall -Wextra -g),然后使用 valgrind狩猎memory leak错误。

关于c - free() 不应该接受 (void *const) 作为输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35860072/

相关文章:

C:程序在尝试释放 2D 数组本身时崩溃

ios - 在 Swift 中访问 C 宏

c - 使用网络 snmp :can not regularly read and update data from a file

c - 指针和递归有问题

c - 为什么 free() 并没有真正释放内存?

c - 在C标准库函数中如何确定返回char指针是否需要空闲?

c - c中的二维数组和指针

c++ - pclint 执行时包含文件的顺序是否重要?

c - 如何在不将其作为 C 函数的返回值的情况下修改 int 指针?

C# 数组和指针