我总是怀疑这个疑问。请参阅以下计划:
#include <stdio.h>
char * function1(void);
int main()
{
char *ch;
ch = function1();
printf("hello");
free(ch);
return 0;
}
char* function1()
{
char *temp;
temp = (char *)malloc(sizeof(char)*10);
return temp;
}
我在这里泄漏了记忆吗?
该程序不会因为某些警告而崩溃:
prog.c: In function ‘main’:
prog.c:11: warning: implicit declaration of function ‘free’
prog.c:11: warning: incompatible implicit declaration of built-in function ‘free’
prog.c: In function ‘function1’:
prog.c:19: warning: implicit declaration of function ‘malloc’
prog.c:19: warning: incompatible implicit declaration of built-in function ‘malloc’
并打印你好。
我只是C.so的初学者请帮助我理解在function1.does中返回语句之后会发生什么事情真的释放了funtion1中分配的内存?
答案 0 :(得分:7)
您的代码没有泄漏任何内存,因为您free(ch);
free
malloc
内部function1
分配的内存char* function1()
{
char *temp;
temp=(char *)malloc(sizeof(char)*10);
printf("temp: %p\n", temp);
return temp;
}
。
您可以通过打印指针地址来检查这一点,即:
ch = function1();
printf("ch: %p\n", ch);
和
ch
您应该会看到两个打印件(temp
和free(ch);
)都会打印相同的地址。因此,free
将malloc
正确的free
ed内存块。
您也可以使用valgrind检查您的代码是否free
分配了内存。
函数malloc
,stdlib.h
在#include <stdlib.h>
#include <stdio.h>
...
定义。
在您的代码中添加:
malloc
此外,投射temp=(char *)malloc(...);
返回值{{1}}并不是一个好主意。
阅读here。
答案 1 :(得分:2)
您需要包含stdlib.h
才能使用free
和malloc
。
在上面的代码中,free
和malloc
实际上做了什么并不重要,所以它仍然有效。
答案 2 :(得分:0)
是的,free释放在函数1中分配的内存并将其返回到空闲内存池,以便可以重用它。这很重要,因为如果你没有释放内存,你就可以在RAM满了的情况下到达,并且调用malloc失败。
包含stdlib.h,因为它包含malloc的定义。
另外,如果您使用免费,则不会泄露内存
答案 3 :(得分:0)
建议的替代方案:
#include <stdio.h>
#include <malloc.h>
char * function1(void);
int
main(int argc, char *argv[])
{
char *ch = function1();
if (!ch)
printf("ERROR: Unable to allocate memory!\n");
else
{
printf("Allocation successful.\n");
free(ch);
}
return 0;
}
char*
function1()
{
return (char *)malloc(10);
}
编译:
gcc -Wall -pedantic -o x x.c(其中“x.c”是源文件,“x”是.exe)