想象一下下面的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSTRSIZE 2048
int main()
{
char *str;
str = get_string();
return 0;
}
char * get_string()
{
char temp[MAXSTRSIZE], *str;
fgets(temp,MAXSTRSIZE,stdin);
str = malloc( sizeof(char) * (strlen(temp) + 1) );
strcpy(str, temp);
return str;
}
我需要在函数get_string
中释放()temp
变量吗?如果get_string
代码在main()
内部呢?
free调用仅适用于动态分配的内存,而不适用于静态内存分配
因此,如果使用malloc/calloc动态分配的任何东西需要在指定内存块的引用计数达到零时被释放,另一方面,静态分配的内存必须根本不被释放,我认为程序本身没有权利释放静态分配的内存
如果您尝试释放静态内存编译器,理想情况下会在编译时抛出警告,如下所示尝试释放非堆对象
,如果忽略警告,则在free
时将出现很好的运行时崩溃。* glibc发现 。/。输出:free():无效指针:*
永远不要尝试释放非堆对象
调用者需要确保str
被释放。temp
不是动态分配的,所以你不能释放它。
你必须free()
无论你malloc()
,这并不重要何时何地,但它必须发生,以防止内存泄漏。当free()
被调用时,该指针不能再被解引用。
注意get_string()
必须在main()
之前声明或定义。
您不需要(绝对不能)释放temp
变量,但您需要在main
中释放str
(因为它是get_string中的malloc
)。