你正在创建一个结构,你需要在程序中稍后销毁它。但是由于某些错误,实际上可能没有分配struct,因此您需要检查指针是否有效(编辑:检查NULL
不能确保指针有效,请参阅LucasHenrique's and Giorgi's comments) 。基本上你可以用两种方式做到这一点。
检查“顶部”:
main.c中:
struct my_struct* foo = create();
...
if (foo) {
destroy(foo);
}
mystruct.c:
void destroy(struct my_struct* foo) {
/* Do clean up */
}
检查“底部”:
main.c中:
struct my_struct* foo = create();
...
destroy(foo);
mystruct.c:
void destroy(struct my_struct* foo) {
if (foo) {
/* Do clean up */
}
}
第一个确保用户正确清理所有内容,但第二个代码为main.c提供了更清晰的代码(尽管在这种情况下'destroy'可能不是该函数的最佳名称)。我无法确定我应该遵循哪个原则,我想知道其中一个是否有任何真正的缺点?
答案 0 :(得分:1)
destroy()
函数应该检查是否有任何事情要做。
除此之外,需要编写,编译等代码较少,因为可能会有很多调用destroy()
但只有一次调用它。
注意destroy()
在调用指针时不能使指针为空:
foo = create ();
/* use foo a lot */
destroy (foo);
/* No matter what destroy() does, foo is unchanged here */
/* and can be dangerously dereferenced to inspect or modify the object, etc. */
答案 1 :(得分:0)
我们假设你正在写一个公共图书馆。如果您以C库为例,在大多数函数中,您必须将指针传递给有效对象(空指针不是)。一个例外是free
函数(类似于destroy
函数),它允许free(NULL)
并使用这样的参数进行无操作。