【问题标题】:Using free with double pointer to a struct将 free 与指向结构的双指针一起使用
【发布时间】:2020-01-21 14:27:30
【问题描述】:

我想了解如何使用free 函数。在下面的 sn-p 中,我使用 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 的方式有点困惑。

【问题讨论】:

  • 如有疑问,请务必检查数据类型。
  • 顺便说一句,您不应该为您自己的类型使用以_t 结尾的名称——这些名称是标准 C 保留的——您可以使您的分配更明显地适合变量的大小:ctx = malloc(sizeof *ctx);

标签: c memory-management malloc free


【解决方案1】:

你在 main 中声明了一个指针

context_t* ctx = malloc(sizeof(struct context_t));

要释放 main 中分配的内存,您可以编写

free( ctx );

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

serve(&ctx);

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

oid serve( context_t **p ) {

那是你需要写的

free( *p );

其中*p 是原始对象ctxlvalue

【讨论】:

    【解决方案2】:

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

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

    所以假设函数声明为:

    void serve(struct context_t **ctx) {
    

    你想free(*ctx) 在这个函数里面。

    【讨论】:

    • 如果我需要在 main 中执行此操作,那就是 free(ctx)
    【解决方案3】:

    ma​​lloc 函数用于在程序执行期间分配一定数量的内存。它向操作系统发送请求,如果可能,操作系统将从堆中保留请求的内存量。 (函数返回分配空间的地址)

    +-------+------------------+------+----------------------+
    | stack | -> free space <- | heap | data & code segments |
    +-------+------------------+------+----------------------+
    

    free 以另一种方式工作,它获取指向某个内存块的地址 (reference) 并释放它。

    如果你希望它在 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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 2011-11-30
      • 2019-01-18
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多