c - 如果分配失败,我应该手动调用销毁还是释放成员

标签 c struct coding-style abstract-data-type

假设我有一个 ADT 和一些函数:

typedef struct myADT_t *myADT;
struct myADT_t {
    T1 *m1;
    T2 *m2;
};

myADT myADT_create() {
    myADT new_myADT=malloc(sizeof(*new_myADT));
    if (!new_myADT) return NULL;
    if (!(new_myADT->m1=malloc(sizeof(T1)))) {
        free(new_myADT);
        return NULL;
    }
    if (!(new_myADT->m2=malloc(sizeof(T2)))) {
        free(new_myADT->m1);
        free(new_myADT);
        return NULL;
    }
    //put some values in *m1 and *m2
    return new_myADT;
}

void myADT_destroy(myADT var) {
    if (!var) return;
    free(var->m2);
    free(var->m1);
    free(var);
}

有人告诉我,如果最后一次分配失败,我可以调用 myADT_destroy,而不是手动释放 new_myADT->m1new_myADT .但是,在我看来,尽管它会起作用,但我不应该使用未成功创建的对象调用 myADT_destroy。另外,如果我将成员添加到 myADT_t,这可能会使事情变得困难。

我应该选择什么?

最佳答案

如果您小心地将您分配的结构初始化为零(显式或使用 calloc),那么您可以在失败时调用您的 myADT_destroy 函数。 C 规范明确允许使用 NULL 指针调用 free

这样做,您可以大大简化 myADT_create 函数,还可以创建一些对称性。

关于c - 如果分配失败,我应该手动调用销毁还是释放成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23653760/

相关文章:

c# - 微软编码风格问题

coding-style - 装饰器中的 Python 命名约定

java - 实例变量声明的放置

c - C 结构体中的可变二维数组

c - C 中对 `SHA1' 的 undefined reference

c - C 中的错误 "Expression must have a pointer to object type"

go - beego中可以使用多个注解吗?

matlab - 从返回结构体的函数返回一个字段

c - 为什么内部结构中不允许使用 typedef?

c - 如何检查我的字符字符串是否有空格?