c语言内存回收
A. c语言 分配内存不回收的后果
内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
在以下情况,内存泄漏导致较严重的后果:
* 程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理)
* 新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时
* 程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候
* 泄漏在操作系统内部发生
* 泄漏在系统关键驱动中发生
* 内存非常有限,比如在嵌入式系统或便携设备中
* 当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。
B. 我写了一个C语言垃圾回收器,可用于C程序的内存回收。这个有利用价值吗
没有代码或者运行时效果你叫我们怎么评价?性能表现?效果如何?反应如何?都不知道。。。。
不过就我看来,native code使用GC的意义不算大。。。既然使用native code说明随性能要求很严格,使用GC不如自行进行内存管理。。
嘛,说那么多还是想说楼主这个虽然对c价值不太大,但如果你坚持的话,GC这个东西本身是很有价值的,比如托管代码(例如.NET平台)、动态语言(例如Ruby)等领域都是很有价值的的研究方向。。。
祝你成功
C. C语言中使用malloc分配内存后没有回收,有办法解决么
7.5 free 和 delete 把指针怎么啦?
别看 free 和 delete 的名字恶狠狠的(尤其是 delete) ,它们只是把指针所指的内存给
释放掉,但并没有把指针本身干掉。
用调试器跟踪示例 7-5,发现指针 p 被 free 以后其地址仍然不变(非 NULL) ,只是
该地址对应的内存是垃圾,p 成了“野指针” 。如果此时不把 p 设置为 NULL,会让人误
以为 p 是个合法的指针。
如果程序比较长,我们有时记不住 p 所指的内存是否已经被释放,在继续使用 p 之
前,通常会用语句 if (p != NULL)进行防错处理。很遗憾,此时 if 语句起不到防错作用,
因为即便 p 不是 NULL 指针,它也不指向合法的内存块。
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是 p 所指的地址仍然不变
…
if(p != NULL) // 没有起到防错作用
{
strcpy(p, “world”); // 出错
}
示例 7-5 p 成为野指针
7.6 动态内存会被自动释放吗?
7.7 杜绝“野指针”
7.8 有了 malloc/free 为什么还要 new/delete ?
7.9 内存耗尽怎么办?
7.10 malloc/free 的使用要点
7.11 new/delete 的使用要点
7.12 一些心得体会
参考文献:
高质量 C++/C 编程指南 - 林锐 2001
D. 运行完C语言程序需要把内存回收
1.不回收就会在内存里占着,这段内存不能重新分配使用了。你的程序运行越久,机器内存不能用的越多,后来完全就是卡。。很卡。。非常卡。。机器卡死这样
2.重启会断电的,内存一旦断电就清0了
3.这个问题不专业,内存是由每个程序申请使用的,如果你的程序自己不做好控制,把该释放的释放掉,那么win7和vs2010也没有办法
E. c语言中被调用函数中变量的内存回收问题
“wawawa”是个常量,而不是变量,就更谈不上局部和全局之说了。你的程序只是将指针指向了这个常量,所以P的内容是确定的。
F. c语言中程序结束时,动态内存会释放吗是由谁释放的
1 从C语言本身设计来说,不会释放。x0dx0a所谓动态内存,是由malloc系列函数进行申请的内存,除非在程序中使用free释放,否则该段内存不会被释放掉。x0dx0a从这个角度来说,即使进程结束,该段内存也会被占用。这种现象被称为内存泄露。x0dx0a2 大多数操作系统可以智能释放。x0dx0a动态内存由于是进程使用,向操作系统控制方申请的内存,所以操作系统内核可以记录哪些内存由哪个进程使用,这样为了减少内存泄露的危害,操作系统内核均实现了在进程退出后,进程分配的自用内存自动回收的机制。x0dx0a3 仍要避免在书写只分配不释放的代码。x0dx0a作为代码编写者,要遵从C语言要求的自行释放不用内存的规则,使程序尽量少占用资源。否则是对内存资源的浪费。
G. c语言内存怎么回收和代码是什么
在C语言中,使用malloc来动态申请内存,申请完后必须释放该空间。如果不手动释放,那么只能等程序运行结束后系统去回收,但在程序运行过程中容易造成内存溢出的问题,所以应该使用free(void*)来手动释放申请的空间,这样可以保证程序的健壮性。案例如下:x0dx0a #include "stdio.h"x0dx0a #include "stdlib.h"x0dx0a #include "string.h"x0dx0a void main()x0dx0a {x0dx0a //申请20个字节空间x0dx0a char *str = (char*)malloc(20);x0dx0a //将空间内容设置为\0x0dx0a memset(str, '\0', 20);x0dx0a //为每个字节空间赋值x0dx0a char *p = str;x0dx0a for (int i = 0; i < 10; i++)x0dx0a {x0dx0a *p++ = 'a' + i;x0dx0a }x0dx0a printf("str=%s\n",str);x0dx0a //释放申请的空间,交回给系统x0dx0a free(str);x0dx0a }x0dx0a运行结果为:x0dx0astr=abcdefghijx0dx0aPress any key to continuex0dx0a x0dx0a这个案例很简单,但也很能说明问题,我想应该对你帮助,呵呵。x0dx0a x0dx0a补充:在C++中,动态申请空间使用new方法(new方法底层调用的其实是malloc方法),释放时使用delete方法(底层调用的是free)。
H. 运行完C语言程序需要把内存回收
如果操作系统是Windows等成熟的系统的话,程序运行结束之后系统会自动把内存收回。否则的话,由于可用内存减少,机器上的程序运行会越来越慢,甚至完全无法运行……只要机器彻底重启,被占用的内存会被释放
I. 在C语言进行编程中,为什么要释放旧内存
我们老师说的是C++
没有回收动态申请内存的机制。需要主动释放。JAVA等高级语言有这种机制。刚查了下貌似C++确实没有。
即是说C/C++
都需要主动释放动态申请的内存。
试着解释下为什么要主动释放动态申请的内存:
1.动态申请的内存,存储在堆中,编译器不会自己回收,回收的意义:通俗讲就是告诉编译器,这片内存可以使用。
如果不被回收,这片内存就永远都不会被重新利用。也就是内存泄露。
例如
int
*a=(int
*)malloc
(sizeof(int)*4);
2.现在只有a这个指针指向这片动态申请的内存,再没有别的路径可以找到这片内存空间了。如果在释放a所指向的内存空间之前就改变了a的指向,那么可知,这片内存,将不可能再被找到了。那么这片内存就不会被释放,也就是上面说到的内存泄露。
J. C语言内存回收机制
是已经被回收了,这样用时有问题。应该
char
*f(){
char
*buf=(char*)malloc(5);
strcpy(buf,
"abc");
return
buf;
}
用后记得free。