You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言内存释放函数的典型原型是什么?第二种原型是否符合惯用写法?

C语言内存释放函数的两种原型分析

先看你给出的示例代码(已修正其中的语法错误):

struct foo *foo_create(int);
void foo_free_v1(struct foo *);
void foo_free_v2(struct foo **);

void bar() {
    struct foo *foo = foo_create(7);

    // ...

    // Version 1
    foo_free_v1(foo);

    // Version 2
    foo_free_v2(&foo);
}

一、C语言内存释放函数的典型原型

C标准库的free函数是最典型的代表,原型为:

void free(void *ptr);

也就是传递指针本身的形式(对应示例中的foo_free_v1)。这种形式是C语言中最普遍、最符合标准惯例的写法,绝大多数自定义内存释放函数都会遵循这个模式。

二、第二种形式(指针的指针)是否属于惯用写法?用途是什么?

这种void foo_free_v2(struct foo **)形式确实是C语言里的一种惯用写法,主要适用于以下场景:

  • 自动置空原指针,避免野指针风险:在foo_free_v2内部,释放内存后可直接把传入的原指针(也就是bar函数里的foo)设为NULL,后续代码如果误操作该指针,不会访问到已释放的无效内存。比如函数内部可以这样实现:
    void foo_free_v2(struct foo **ptr) {
        if (ptr && *ptr) {
            free(*ptr);
            *ptr = NULL; // 将原指针置空
        }
    }
    
  • 适配多层指针的释放场景:如果代码中存在指向指针的指针(比如二维动态数组、链表节点的指针引用等),这种形式能直接操作最上层的指针,确保释放后不会留下无效的指针引用。
  • 简化调用方的错误处理:如果释放过程需要额外校验(比如检查指针有效性、是否属于当前内存池等),通过指针的指针传递,所有逻辑都可以在函数内部完成,调用方无需额外编写置空或校验代码。

不过这种写法并非通用场景的首选:如果调用方不需要自动置空,或者只是简单释放单个指针,第一种形式会更简洁直接,符合标准库的使用习惯。

内容的提问来源于stack exchange,提问作者IPribec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:25:24