内存清理C:哪里检查指针?

时间:2015-04-21 18:37:11

标签: c pointers memory

你正在创建一个结构,你需要在程序中稍后销毁它。但是由于某些错误,实际上可能没有分配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'可能不是该函数的最佳名称)。我无法确定我应该遵循哪个原则,我想知道其中一个是否有任何真正的缺点?

2 个答案:

答案 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)并使用这样的参数进行无操作。