DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xiao2024
今日帖子: 17
在线用户: 5
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2016/11/30 19:27:45
标题:
Freeamdnil的问题 浏览:1056
加入我的收藏
楼主: Berlin 10.1 update2下面,跟了一下freeandnil的源码,原来是先nil后free,在free里面先检查是不是nil,不是的话调用destroy,结果destroy根本没调用。
不是应该先free后nil么,否则自己写的destroy函数毛用没有
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
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}
----------------------------------------------
-
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2016/12/1 13:16:15
2楼: temp free的时候obj还在么?
我原来直接用freeandnil发现destroy没被调用,改成自己先free后nil就好了
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2016/12/1 13:53:52
3楼: temp free的时候obj当然在了!
----------------------------------------------
-
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
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
----------------------------------------------
-我的博客
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2016/12/1 16:44:34
6楼: 多谢楼上几位,我回头写段代码测试一下
----------------------------------------------
-
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2016/12/2 8:25:01
7楼: 这个函数你就不用怀疑了,这么简单的东西,使用频率也非常高,肯定不会有问题的。
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
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.
----------------------------------------------
-我的博客
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行62.5毫秒 RSS