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);
}
在这里,对 foo
中 i
所做的更改不会更改 `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
.
类型没有多大意义
我试图了解免费的工作原理。
标准中是否定义 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);
}
在这里,对 foo
中 i
所做的更改不会更改 `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
.