我试图了解如何使用free
函数。在下面的代码片段中,我使用malloc
创建ctx
。
void serve(ctx **some_struct_type) {
// .. some operation
}
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
serve(&ctx);
}
由于每个malloc调用都必须有一个相应的free
调用,并且我想在serve
内部免费调用,它应该是free((**ctx))
还是free((*ctx))
?
我对必须免费调用的方式有点困惑。
你在 main 中声明了一个指针
context_t* ctx = malloc(sizeof(struct context_t));
要释放主中分配的内存,您可以写入
free( ctx );
但是,您通过引用函数传递了指针serve
serve(&ctx);
因此,要在函数中获取引用的对象(指针(,您必须取消引用声明为函数参数的指针(我将更改函数参数以使函数有意义(
oid serve( context_t **p ) {
那就是你需要写
free( *p );
其中*p
是原始对象的lvalue
ctx
。
在main
中,ctx
的值是已分配内存块的地址。 正是这个值传递给free
.
如果将ctx
的地址传递给函数,则需要取消引用该指针以获取从malloc
获取的指针值。
因此,假设函数声明为:
void serve(struct context_t **ctx) {
您希望free(*ctx)
此函数内部。
>malloc函数用于在程序执行期间分配一定量的内存。它向操作系统发送请求,如果可能,操作系统将从堆中保留请求的内存量。(该函数返回已分配空间的地址(
+-------+------------------+------+----------------------+
| stack | -> free space <- | heap | data & code segments |
+-------+------------------+------+----------------------+
free以另一种方式工作,它获取指向某个内存块的地址(引用(并解除分配它。
如果您希望在 main 中解除分配它,您可以这样做:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
free(ctx);
}
但是由于您要将其转换为双指针(指针到指针(,因此您需要将其取消引用回您分配的地址:
int main() {
context_t* ctx = malloc(sizeof(struct context_t));
ctx **some_struct_type = &ctx;
free(*some_struct_type);
}