C 释放函数中分配的内存

C 释放函数中分配的内存,c,function,malloc,C,Function,Malloc,以这段代码为例: int *doSomething(void) { int *something = malloc(sizeof(int)); return something; } int main() { int *point = doSomething(); //code does something... free(point); } 我想知道我是否必须释放doSomething()中分配的内存,比如在返回某些内容之后我必须做免费(某事)吗?或

以这段代码为例:

int *doSomething(void) {
    int *something = malloc(sizeof(int));
    return something;
}

int main() {
    int *point = doSomething();
    //code does something...
    free(point);
}
我想知道我是否必须释放
doSomething()
中分配的内存,比如在
返回某些内容之后我必须做
免费(某事)吗?或做
自由(点)
还清除
某些内容

或者我必须做一些免费的事情主功能中的

不需要在
doSomething()
中释放内存,
free(point)
应该在
doSomething()
中释放内存
malloc()
,前提是指针没有递增(涉及指针算术),因为指针必须传递到
free()
必须由其中一个*
alloc()函数返回

在检查
point!=空


注意:当你说清除时,你应该知道内存并没有被清除,它只是被释放出来供再次使用,清除它是不必要的,也是昂贵的。

根据经验,任何对
malloc
的调用都必须在稍后通过调用
free
来成功。当然,您给
free
的参数必须是
malloc
的返回值。但是,在您的特定情况下,您已经到达程序的末尾(主函数的末尾),因此您不必担心内存问题,因为它将返回到操作系统。调用
free
更像是一种迂腐的习惯,它还表明您知道您的程序正在使用什么内存

当你做以下事情时,事情会变得更糟:

int *p = malloc(...);
/* do some stuff */
p = malloc(...);

在上面的示例中,第一个malloc分配的内存块将永远丢失(也就是说,只要您的程序运行)。

我认为最后一个不会工作,因为某些内容应该仅在doSomething函数中“可见”…您当前的代码是正确的。好的!所以基本上,如果在代码末尾的“某物”和“点”仍然有相同的地址,那么做free(点);在main函数上,还将清除doSomething函数中分配的“某物”。我说的对吗?“不,你们不必”——你们应该提到你们回答了OP的哪个问题。@THZ是的。对的请注意,一旦函数结束,指针
某物将被删除,但分配的内存段不会被删除。谢谢你们两位。:)@THZ我想你把指针变量和指针所持有的值搞混了。对于
free
,重要的是值,而不是保存该值的实际变量。虽然这是真的,但我最初担心的是您告诉OP不要担心释放内存。如果这不是
main()
函数,那么缺少
free()
(如果函数不打算返回指针)从长远来看将是一个严重的问题(如果程序打算长时间运行)。这是一个迂腐但很好的习惯,没错。然而,我没有说任何虚假的话。导致内存泄漏的不是不可触及的内存,而是无法触及的内存,伤害我们的是无法触及的内存。可访问的、未经剥离的内存没有问题(当然,如果您仍然需要它的话)。在现实环境中,从
main()
返回不会释放内存。并非所有人都使用在进程结束后进行清理的操作系统。从长远来看,依赖主机系统清理内存的程序员会遇到麻烦——例如,当将代码移动到重复分配内存的函数中时,但从不释放内存。我同意,如果不显式地
释放
内存,可能会导致更多问题,但我认为人们过于直截了当,根本不过滤信息,只相信他们在谷歌显示的第一个链接上找到的任何东西。我认为重要的是要理解,即使是一个C语言新手,记忆到底会发生什么。此外,它不会从主服务器返回导致内存被释放的原因,一点也不会。它正在完成这个过程,并从物理内存中取消页面映射(操作系统完成的操作)。