假设我有一个 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->m1
和 new_myADT
.但是,在我看来,尽管它会起作用,但我不应该使用未成功创建的对象调用 myADT_destroy
。另外,如果我将成员添加到 myADT_t
,这可能会使事情变得困难。
我应该选择什么?
最佳答案
如果您小心地将您分配的结构初始化为零(显式或使用 calloc
),那么您可以在失败时调用您的 myADT_destroy
函数。 C 规范明确允许使用 NULL
指针调用 free
。
这样做,您可以大大简化 myADT_create
函数,还可以创建一些对称性。
关于c - 如果分配失败,我应该手动调用销毁还是释放成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23653760/