malloc会在函数结束时自动释放内存吗?

4

如果有人能帮助我完全理解以下代码之间的区别,我会非常高兴:

// Code (1)
void f1 ( void ){
  int * ptr1 = malloc ( sizeof(int) );
}

// Code (2)
void f2 ( void ){
  int * ptr2 = malloc ( sizeof(int) );
  free(ptr2);
}

据我所知,指令free用于释放已使用的内存,但另一方面,每次调用函数g时,如果有新变量需要声明,则它们将在g执行后创建和销毁(即被释放了,对吗?)。
因此:
我们需要在Code(2)中使用指令free吗?还是多余的?(但也许建议使用以使代码更清晰)
谢谢
PS:您可能还有兴趣帮助我解决我的先前相关问题。在那里,一些用户建议使用动态分配内存,并且我正在尝试理解为什么/如何使用。

2
不,你必须使用free函数。 - CoderPi
请注意,还有另一个分配函数alloca,它在调用函数结束时自动释放内存。然而,我从未见过它被使用。我认为这是因为大多数开发人员都认为支持alloca所需的额外簿记不足以证明其使用,与确保您的mallocfree调用正确配对相比。 - DaoWen
@DaoWen:alloca()在C标准或POSIX中没有描述。 - pmg
5个回答

9

不会的,malloc 不会释放已分配的内存。你需要使用 free 来释放已分配的块。
在程序结束时 (main 函数),系统会自动释放分配的内存,但最好显式释放它。

请记住,如果没有特别释放,动态分配的内存的生命周期将持续到程序结束。


谢谢,我认为这非常有趣!因此,“每个在函数中创建的新变量将在结束时被销毁”的一般规则是错误的,“malloc情况”是一个重要的例外,对吗? - Biagio
@Biagio; 是的。如果有一个static局部变量,那么它的生命周期也将是程序结束。 - haccks
嗨,malloc()分配的内存是在堆上还是栈上或其他地方? - Louise
1
@Louise;动态内存分配在堆上,而静态内存分配在栈上。 - haccks

6
如前所述,malloc分配的内存应该通过free释放,否则会造成内存泄漏。令您困惑的是ptr1变量本身没有被分配(而不是它指向的内存)。分配的内存不是一个变量。因此,当您退出f1时,您将无法再访问已分配的内存,因为您已经丢失了地址。 顺便说一下,在您之前的问题中,您并没有解释为什么需要新地址。

3
不,malloc()在函数终止时不会释放内存。
如果我可以提出建议...
如果您想(非常)小的对象仅在(非递归)函数中分配空间,则可以使用C99的可变长度数组
int foobar(size_t small_n) {
    struct whatever autorelease[small_n]; // C99 VLA
    // use autorelease
    // no need to free
    return 0;
} // memory for autorelease object released

2

2
除了其他回答中对C动态内存分配C dynamic memory allocation的解释和需要显式调用free来释放每个malloc分配的数据(以及何时调用free是一个问题;你要避免memory leaks),你会发现像valgrind这样的工具非常有用,你也可以考虑使用Boehm's garbage collector。你基本上可以在整个程序中将malloc替换为GC_malloc,而不必过多地考虑显式的free
当然,先阅读垃圾回收的维基页面,然后再看GC手册。它确实有一些注意事项。因此,Boehm的垃圾回收并非万无一失的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接