资源申请类
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
比如main函数里有一句malloc(),
后面没有free()
1.那么当main结束后,动态分配的内存不会随之释放么?
2.如果程序结束能自动释放,那么还加上free(),是出于什么考虑?
1. 就算没有free(),main()结束后也是会自动释放malloc()的内存的,这里监控者是操作系统,设计严谨的操作系统会登记每一块给每一个应用程序分配的内存,这使得它能够在应用程序本身失控的情况下仍然做到有效地回收内存。
你可以试一下在TaskManager里强行结束你的程序,这样显然是没有执行程序自身的free()操作的,但内存并没有发生泄漏。
2. free()的用处在于实时回收内存。
如果你的程序很简单,那么你不写free()也没关系,在你的程序结束之前你不会用掉很多内存,不会降低系统性能;而你的程序结束之后,操作系统会替你完成这个工作。
但你开始开发大型程序之后就会发现,不写free()的后果是很严重的。
很可能你在程序中要重复10k次分配10M的内存,如果每次使用完内存后都用free()释放,你的程序只需要占用10M内存就能运行;但如果你不用free(),那么你的程序结束之前就会吃掉100G的内存。
这其中当然包括绝大部分的虚拟内存,而由于虚拟内存的操作是要读写磁盘,因此极大地影响系统的性能。
你的系统很可能因此而崩溃。
3. 任何时候都为每一个malloc()写一个对应的free()是一个良好的编程习惯。
这不但体现在处理大程序时的必要性上,更体现在程序的优良的风格和健壮性上。
毕竟只有你自己的程序知道你为哪些操作分配了哪些内存以及什么时候不再需要这些内存。
因此,这些内存当然最好由你自己的程序来回收。
利用动态分配内存方法,编写一个能计算N位整数相加的程序,N<=100。
#include <stdio.h>
#include <malloc.h>
signed long sum(signed long array[], int n)
{
signed long result=0;
for (int i=0; i<n; i++)
{
result+=array[i];
}
return result;
}
void main()
{
printf("楼主,你想输入多个数:");
int n=0;
scanf("%d",&n);
signed long* arr=(signed long*)malloc(sizeof(signed long)*n); for (int i=0; i<n; i++)
{
printf("请输入第%d个数:",i+1);
scanf("%d",&arr[i]);
}
printf("累计总和: %d\n",sum(arr,n));
}。