内存free问题?分不多,全部家当!!(10分)

  • 主题发起人 主题发起人 海之魂
  • 开始时间 开始时间

海之魂

Unregistered / Unconfirmed
GUEST, unregistred user!
在程序(或函数)中创建的对象(在函数中为局部对象)如果没有free,退出程序(或函
数)后,所占内存是不是自动被系统(或主程序)收回?
我感到好象是这样的,但又不太确定!!
 
好象要free
 
不是这样,你必须自己释放创建的对象,虽然程序在完全退出时Windows会清理内存,
但是如果你不释放,还是有小部分的内存丢失的。
 
如果是动态申请空间的话是应该free的吧。

像这样:
try
new(xx).........
except
........
finally
Freemem(xx);
end;

是不是可以。
 
有没有比较肯定的答案啊?
我想知道!
 
自己分配的,自己Free。
程序分配的,程序Free。
否则就会有内存泄漏。
 
系统会清除。内存泄漏的害处并不是你理解的意思,不要搞错了。
 
进程结束后,系统会回收其所占的资源,但并不是说我们就可以不管这些烦心事了[:(]
正如DreamTiger所说的,凡是自己分配的内存或创建的对象,自己要负责释放,
否则如果经常性分配而不释放的话会使系统可用资源越来越少,系统资源耗尽以后,
你的程序可能会出现非法操作、界面死掉、莫名其妙的报错$#!!%&^@#...
在函数中是这样的,函数的局部变量建立在栈上,函数调用返回时自动清理栈,所以局
部变量就让它自生自灭好了,但指针不一样,如果在函数中显式的为指针分配了内存,你
还是要负责释放的(对象也可以看成是指针)。
还有一个要注意的是两个模块间的内存管理,比如你在一个exe中分配了内存,在另一个
dll中释放它是不行的,应该用Window API来管理内存,如使用HeapAlloc、HeapFree等
 
var
mybutton:Tbutton;
begin
mybutton:=Tbutton.create(self)//窗口成為mybutton的擁有者
//-- 這樣創建時﹐你不用free﹐因為窗口在析構時會把它起析構;
try
mybutton:=Tbutton.create(nil) //這樣就要自己析構
finally
mybutton.free;
end;
 
在房子里头放二百元钱与一个女子
女子会在房子里头数钱,突然房子着火,女子与钱都死光光了。有可能女子逃出来了。
所以还是要杀死那个女的,再烧房子啊
 
也就是说程序或函数退出后,一般会自动回收内存,但是由于系统有时会理解错误,比较傻
(毕竟没程序员聪明),会出现遗滤的情况,所以要自己清除。
另外对无用的对象应及时清除,以免占用系统资源!
 
应该说这与系统有关吧。
9X把DLL是所有程序共用的,如果一些资源在DLL中申请的,退出了进程,
资源也不会释放。而且9X也不是很聪明,释放的时候可以有漏网之鱼。

NT/2000不一样,每一个进程都在自己的内存空间,进程完结时都收回,所以不
释放问题不大。

但我觉得释放资源不是死不死机的问题;而是程序员的编程风格,思路的严密的体现。
及时释放不用的资源,资源优化重组嘛。
 
对于程序来讲重复创建和释放的对象,一般都是手工创建的,所以需要手工释放,特别是服务性程序,如果有内存未释放,将使系统因为资源的不断缺少,最后造成瘫患,所以是一定要手工释放的;对于系统对象,系统也是在退出进程时进行释放;有时候你的对象会在创建父对象,这个时候,父对象有时可以自动进行释放,但这是不推荐的做法!所以我认为从原则上讲应该养成自己创建自己释放的习惯!
 
纠错:有时候你的对象会在创建父对象->有时候你的对象会在创建时指定父对象,而且父对象是一个容器.
 
分太少了,我想增加分值,以分给大家,不知有没有办法啊
 
分不多,谢了
 
后退
顶部