|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2016/11/30 19:27:45 |
标题: |
|
加入我的收藏 |
楼主: |
Berlin 10.1 update2下面,跟了一下freeandnil的源码,原来是先nil后free,在free里面先检查是不是nil,不是的话调用destroy,结果destroy根本没调用。 不是应该先free后nil么,否则自己写的destroy函数毛用没有
----------------------------------------------
- |
作者: |
|
2016/12/1 13:08:30 |
1楼: |
这是XE7里的。难道和这个不一样了? procedure FreeAndNil(var Obj); {$IF not Defined(AUTOREFCOUNT)} var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; {$ELSE} begin TObject(Obj) := nil; end; {$ENDIF}
----------------------------------------------
-
|
作者: |
|
2016/12/1 13:16:15 |
2楼: |
temp free的时候obj还在么? 我原来直接用freeandnil发现destroy没被调用,改成自己先free后nil就好了
----------------------------------------------
-
|
作者: |
|
2016/12/1 13:53:52 |
3楼: |
temp free的时候obj当然在了!
----------------------------------------------
-
|
作者: |
|
2016/12/1 14:40:40 |
4楼: |
那为什么destroy没被调用呢? 也许是我其他地方错了? 自己调用free就可以
----------------------------------------------
-
|
作者: |
bdl1 (bdl1) |
▲▲▲▲▲ |
-
|
普通会员 |
|
2016/12/1 15:06:28 |
5楼: |
我试了,用FreeAndNil(obj) 是调用obj的Destroy方法的。
berlin up2. win32
----------------------------------------------
-我的博客
|
作者: |
|
2016/12/1 16:44:34 |
6楼: |
多谢楼上几位,我回头写段代码测试一下
----------------------------------------------
-
|
作者: |
|
2016/12/2 8:28:12 |
8楼: |
刚刚写了测试代码,找到原因了 原来是自己写的析构函数后面忘写override了
freeandnil里面free的时候是把扩展类转成TObject再free的, 如果扩展类的destroy没有标明override,是不是就直接调用Tobject的析构函数了?
罪过
----------------------------------------------
-
|
作者: |
bdl1 (bdl1) |
▲▲▲▲▲ |
-
|
普通会员 |
|
2016/12/2 8:59:56 |
9楼: |
你不用Override,当然不会调用Destroy.
----------------------------------------------
-我的博客
|
|