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

Shouldn't free() accept a (void *const) as input arg

我试图了解免费的工作原理。 标准中是否定义 free() 不会更改传递给它的指针?

在标准 C 中,参数传递是按值传递的。所以一个函数不能改变它的参数值(这不是 free 特有的)。每次调用都是 call by value。如果在一个函数内你改变了一些参数,只有那个参数的本地副本(例如在一些机器寄存器中)被改变并且调用者看不到任何变化。

如果你想改变一些东西,你将把那个东西的地址作为一个值传递,然后你将取消引用那个指针。

因此 free 不会更改您传递给它的指针,但您需要确保永远不再使用该指针。否则就是undefined behavior. A common style is to code free(ptr), ptr=NULL; (so that any further access thru ptr would crash with a segmentation fault).

在实践中,C standard library are marking a free-d zone to be reusable by future malloc. But sometimes (notably when freeing a large memory zone) the memory is released to the kernel (e.g. by munmap(2) 的大多数实现都在 Linux 上)。内存区域真正发生的事情是特定于实现的。

阅读 C dynamic memory allocation & virtual address space 的维基页面。

另请查看一些 free software C standard library implementation (e.g. most libc on Linux, such as musl-libc or GNU libc...). Compile your code with all warnings & debug info (e.g. gcc -Wall -Wextra -g if using GCC...) then use valgrind to hunt memory leak 错误的源代码。

const 存储类型告诉编译器您不打算在分配(动态或静态)后修改内存块。释放内存正在修改它。

是否free改变输入参数与调用代码无关。调用代码仍然有指针。它类似于将 int 传递给函数。被调用的函数可能会改变变量,但它是副本的改变,而不是原始的。

void foo(int i)
{
   i += 2;
}

void bar()
{
   int i = 10;
   foo(i);
}

在这里,对 fooi 所做的更改不会更改 `bar.i 中的值。

同样,

void free(void* ptr)
{
   // Do the needful to deallocate
   ...
     ptr = NULL;
}

void test()
{
    char* p = malloc(10);
    ...
    free(p);
}

这里,free中对ptr所做的更改不会更改test中指针的值。因此,将 free 的参数设为 void* const.

类型没有多大意义