将 free 与指向结构的双指针一起使用

Using free with double pointer to a struct

我正在尝试了解如何使用 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,应该是free((**ctx))还是free((*ctx))

我对必须调用 free 的方式有点困惑。

main中,ctx的值是分配内存块的地址。正是这个值被传递给 free.

如果将 ctx 的地址传递给函数,则需要取消引用该指针以获取从 malloc 获得的指针值。

所以假设函数声明为:

void serve(struct context_t **ctx) {

你想要free(*ctx)在这个函数中。

您在 main

中声明了一个指针
context_t* ctx = malloc(sizeof(struct context_t));

要释放在 main 中分配的内存,您可以这样写

free( ctx );

但是你通过引用函数传递了指针serve

serve(&ctx);

因此,要在函数中获取引用对象(指针),您必须取消引用声明为函数参数的指针(我将更改函数参数以使其对函数有意义)

oid serve( context_t **p ) {

那就是你需要写

free( *p );

其中 *p 是原始对象 ctxlvalue

malloc函数用于在程序执行期间分配一定数量的内存。它向 OS 发送请求,如果可能,OS 将从堆中保留请求的内存量。 (分配space的函数returns地址)

+-------+------------------+------+----------------------+
| 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);

}