C编程 – 将指针返回到释放状态

我有一个函数foo(),它分配内存并返回它。 在我的主要function结束时,将它释放是我的标准做法吗?

char* foo(){ char * p; p = malloc(sizeof(char) * 4); /* edit - thanks to msg board */ p[0] = 'a'; p[1] = 'b'; p[2] = 'c'; p[3] = '/0'; /* edit: thanks to the msg board. */ return p; } int main(int argc, char *argv[]) { char * p2; p2 = foo(); printf("%s", p2); free(p2); return 0; } 

main()结束时释放将是正确的事情,是的。 但是,您可能会考虑使用null来终止该字符串。 对于所有“同一级别”的内存管理,可以说更为惯用的设计。 就像是:

 void foo(char *p) { p[0] = 'a'; p[1] = 'b'; p[2] = 'c'; p[3] = '\0'; } int main(int argc, char **argv) { char *p2 = malloc(4); foo(p2); printf("%s", p2); free(p2); return 0; } 

“标准练习”,如果有这样的话,就是在你完成后立即释放记忆。

我个人的信念是你应该释放记忆,即使你知道程序即将结束只是因为这是一个好习惯,并且因为某天,某种程度上,你会遇到一个环境,当程序没有自动释放malloced内存退出。

当您不再需要引用该变量时,您需要释放。 但是,当您的程序退出时,将释放分配给它的所有资源。

是的,即使程序在下一行退出,使用它时也可以将它释放出来。

当你分配3个字符时,为什么要malloc(sizeof(int)* 3)?

我原以为在同一个函数中分配和释放内存会更好(在本例中为main())。

例如:

 void foo(char *p) { p[0] = 'a'; p[1] = 'b'; p[2] = 'c'; return ; } int main(int argc, char *argv[]) { char * p2; p = malloc(sizeof(int) * 3); foo(p2); printf("%s", p2); free(p2); return 0; } 

我不知道它是否是“标准练习”,但是free()是必要的,否则你会泄漏记忆。

我会创建两个函数new_foo()delete_foo() ,如下所示:

 char* new_foo() { char * p; p = malloc(sizeof(int) * 4); /* ... */ return p; } void delete_foo(char* p) { free(p); } int main() { char * p2; p2 = new_foo(); /* ... */ delete_foo(p2); return 0; } 

在我看来,这“更有意义”。

这样做的一个很好的理由是你有匹配的malloc / free。 如果代码被移动,程序员自然会寻找匹配的free来与malloc一起使用。 如果它不在那里,它可能是一个混乱的来源(希望不会很久)。

简而言之,它使资源使用更加明显。

一般规则是,一旦您发现不再需要内存,就应该释放内存。 在程序终止之前需要的特定内存情况下,有两个有效的观点。

  • 保持简单:对于每个malloc ,必须有相应的free 。 主要的好处是,如果您想将独立程序转换为更大程序的组件,您的main将变为库调用,并且需要free调用。

  • 保持简单:释放程序的资源是操作系统的工作。 这是一个有效的管理策略 – 程序的内存是一个内存区域 ,当程序退出时可以一次性释放。 主要好处是您不需要跟踪每个已分配的块,有时可能很难(但是您可能想要考虑垃圾收集器)。