海 海之魂 Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-04 #1 在程序(或函数)中创建的对象(在函数中为局部对象)如果没有free,退出程序(或函 数)后,所占内存是不是自动被系统(或主程序)收回? 我感到好象是这样的,但又不太确定!!
Z zqw0117 Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-04 #3 不是这样,你必须自己释放创建的对象,虽然程序在完全退出时Windows会清理内存, 但是如果你不释放,还是有小部分的内存丢失的。
C coolingxyz Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-04 #4 如果是动态申请空间的话是应该free的吧。 像这样: try new(xx)......... except ........ finally Freemem(xx); end; 是不是可以。
D DreamTiger Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-04 #6 自己分配的,自己Free。 程序分配的,程序Free。 否则就会有内存泄漏。
M mikedeakins Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-05 #7 系统会清除。内存泄漏的害处并不是你理解的意思,不要搞错了。
W wangjiachun Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-06 #8 进程结束后,系统会回收其所占的资源,但并不是说我们就可以不管这些烦心事了[] 正如DreamTiger所说的,凡是自己分配的内存或创建的对象,自己要负责释放, 否则如果经常性分配而不释放的话会使系统可用资源越来越少,系统资源耗尽以后, 你的程序可能会出现非法操作、界面死掉、莫名其妙的报错$#!!%&^@#... 在函数中是这样的,函数的局部变量建立在栈上,函数调用返回时自动清理栈,所以局 部变量就让它自生自灭好了,但指针不一样,如果在函数中显式的为指针分配了内存,你 还是要负责释放的(对象也可以看成是指针)。 还有一个要注意的是两个模块间的内存管理,比如你在一个exe中分配了内存,在另一个 dll中释放它是不行的,应该用Window API来管理内存,如使用HeapAlloc、HeapFree等
进程结束后,系统会回收其所占的资源,但并不是说我们就可以不管这些烦心事了[] 正如DreamTiger所说的,凡是自己分配的内存或创建的对象,自己要负责释放, 否则如果经常性分配而不释放的话会使系统可用资源越来越少,系统资源耗尽以后, 你的程序可能会出现非法操作、界面死掉、莫名其妙的报错$#!!%&^@#... 在函数中是这样的,函数的局部变量建立在栈上,函数调用返回时自动清理栈,所以局 部变量就让它自生自灭好了,但指针不一样,如果在函数中显式的为指针分配了内存,你 还是要负责释放的(对象也可以看成是指针)。 还有一个要注意的是两个模块间的内存管理,比如你在一个exe中分配了内存,在另一个 dll中释放它是不行的,应该用Window API来管理内存,如使用HeapAlloc、HeapFree等
H hgood Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-06 #9 var mybutton:Tbutton; begin mybutton:=Tbutton.create(self)//窗口成為mybutton的擁有者 //-- 這樣創建時﹐你不用free﹐因為窗口在析構時會把它起析構; try mybutton:=Tbutton.create(nil) //這樣就要自己析構 finally mybutton.free; end;
var mybutton:Tbutton; begin mybutton:=Tbutton.create(self)//窗口成為mybutton的擁有者 //-- 這樣創建時﹐你不用free﹐因為窗口在析構時會把它起析構; try mybutton:=Tbutton.create(nil) //這樣就要自己析構 finally mybutton.free; end;
N Nizvoo Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-06 #10 在房子里头放二百元钱与一个女子 女子会在房子里头数钱,突然房子着火,女子与钱都死光光了。有可能女子逃出来了。 所以还是要杀死那个女的,再烧房子啊
海 海之魂 Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-06 #11 也就是说程序或函数退出后,一般会自动回收内存,但是由于系统有时会理解错误,比较傻 (毕竟没程序员聪明),会出现遗滤的情况,所以要自己清除。 另外对无用的对象应及时清除,以免占用系统资源!
B BeginDelphi Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-09 #12 应该说这与系统有关吧。 9X把DLL是所有程序共用的,如果一些资源在DLL中申请的,退出了进程, 资源也不会释放。而且9X也不是很聪明,释放的时候可以有漏网之鱼。 NT/2000不一样,每一个进程都在自己的内存空间,进程完结时都收回,所以不 释放问题不大。 但我觉得释放资源不是死不死机的问题;而是程序员的编程风格,思路的严密的体现。 及时释放不用的资源,资源优化重组嘛。
应该说这与系统有关吧。 9X把DLL是所有程序共用的,如果一些资源在DLL中申请的,退出了进程, 资源也不会释放。而且9X也不是很聪明,释放的时候可以有漏网之鱼。 NT/2000不一样,每一个进程都在自己的内存空间,进程完结时都收回,所以不 释放问题不大。 但我觉得释放资源不是死不死机的问题;而是程序员的编程风格,思路的严密的体现。 及时释放不用的资源,资源优化重组嘛。
超 超级野马 Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-09 #13 对于程序来讲重复创建和释放的对象,一般都是手工创建的,所以需要手工释放,特别是服务性程序,如果有内存未释放,将使系统因为资源的不断缺少,最后造成瘫患,所以是一定要手工释放的;对于系统对象,系统也是在退出进程时进行释放;有时候你的对象会在创建父对象,这个时候,父对象有时可以自动进行释放,但这是不推荐的做法!所以我认为从原则上讲应该养成自己创建自己释放的习惯!
对于程序来讲重复创建和释放的对象,一般都是手工创建的,所以需要手工释放,特别是服务性程序,如果有内存未释放,将使系统因为资源的不断缺少,最后造成瘫患,所以是一定要手工释放的;对于系统对象,系统也是在退出进程时进行释放;有时候你的对象会在创建父对象,这个时候,父对象有时可以自动进行释放,但这是不推荐的做法!所以我认为从原则上讲应该养成自己创建自己释放的习惯!
超 超级野马 Unregistered / Unconfirmed GUEST, unregistred user! 2002-08-09 #14 纠错:有时候你的对象会在创建父对象->有时候你的对象会在创建时指定父对象,而且父对象是一个容器.