首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的内存清理:在哪里检查指针?

C中的内存清理:在哪里检查指针?
EN

Stack Overflow用户
提问于 2015-04-21 18:37:10
回答 2查看 424关注 0票数 2

您正在创建一个结构,您需要在以后的程序中销毁它。但是,由于某些错误,结构实际上可能没有被分配,所以您需要检查指针是否有效(编辑:检查NULL不能确保指针是有效的,参见LucasHenrique's and Giorgi's comments)。基本上你可以用两种方式来做。

在“顶部”处检查:

C.主要:

代码语言:javascript
复制
struct my_struct* foo = create();
...
if (foo) {
  destroy(foo);
}

mystruct.c:

代码语言:javascript
复制
void destroy(struct my_struct* foo) {
  /* Do clean up */
}

检查“底部”:

C.主要:

代码语言:javascript
复制
struct my_struct* foo = create();
...
destroy(foo);

mystruct.c:

代码语言:javascript
复制
void destroy(struct my_struct* foo) {
  if (foo) {
    /* Do clean up */
  }
}

第一种方法确保用户正确地清理所有内容,但是第二种方法在main.c中给出了更清晰的代码(尽管在这种情况下,“破坏”可能不是这个函数的最佳名称)。我真的不能决定我应该遵循哪一个原则,我想知道其中一个原则是否有什么真正的缺点?

EN

回答 2

Stack Overflow用户

发布于 2015-04-21 18:41:46

destroy()函数应该明确地检查是否有任何事情要做。

此外,需要编写和编译的代码更少,因为想必有许多对destroy()的调用,但只有一个实例。

请注意,当指针被调用时,destroy()不能使其空出:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-04-21 18:40:49

假设您正在编写一个公共图书馆。如果以C库为例,在大多数函数中,必须将指针传递到有效对象(空指针不为空指针)。一个例外是free函数(类似于destroy函数),它允许free(NULL)并使用这样的参数执行不操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29780478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档