A Another_eYes Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-29 #21 我仔细想了, 怎么就是找不出无效的地方呢? 至于你说的环状结构和创建/释放没什么关系, 唯一需要注意的就是你不能用直接赋值的方法将这个变量传递给另一个使用者, 而必须中间经过引用记数+1这一步.
X xeen Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-30 #23 to Another_eYes: 看这个: Pointer -----> A ------>B ↑ | | ↓ |________ C 局部变量 Pointer 指向A, A、B、C组成了一个环行结构存在于堆中。 很明显A的引用记数为2,B和C则为1. 这时候执行: Pointer := nil;会怎么样? A的引用记数为1,不会释放,B,C也不会释放。这三个对象就内存泄露了. 解决此类方法的万全之策就是使用java或者.net,GC替你帮忙。程序员自己成天 想着怎样释放/分配内存是很累的。
to Another_eYes: 看这个: Pointer -----> A ------>B ↑ | | ↓ |________ C 局部变量 Pointer 指向A, A、B、C组成了一个环行结构存在于堆中。 很明显A的引用记数为2,B和C则为1. 这时候执行: Pointer := nil;会怎么样? A的引用记数为1,不会释放,B,C也不会释放。这三个对象就内存泄露了. 解决此类方法的万全之策就是使用java或者.net,GC替你帮忙。程序员自己成天 想着怎样释放/分配内存是很累的。
D daqun Unregistered / Unconfirmed GUEST, unregistred user! 2005-06-30 #24 还有一个办法,就是使用类工厂. 将所有的类都用工厂方法创建,永远不自己释放,让类工厂来释放. 相当于java的gc
W wkh Unregistered / Unconfirmed GUEST, unregistred user! 2005-08-04 #25 主要是在释放对象时如何将被引用到的地方都赋空; 在TComponent用方法 procedure Notification(AComponent: TComponent; Operation: TOperation) virtual; 来保证通知对象将内存设置为NIll 在使用时用重载这个方法
主要是在释放对象时如何将被引用到的地方都赋空; 在TComponent用方法 procedure Notification(AComponent: TComponent; Operation: TOperation) virtual; 来保证通知对象将内存设置为NIll 在使用时用重载这个方法