为什么下面这样写不安全?

churchatp1 2005-08-17 05:41:15
SomeClass1 := TSomeClass.Create;
SomeClass2 := TSomeClass.Create;
try
{ do some code }
finally
SomeClass1.Free;
SomeClass2.Free;
end;

...全文
166 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanscar 2005-08-18
  • 打赏
  • 举报
回复
呵呵,作了各种测试,finally里面的free出现异常的情况只有一种,就是在执行finally的free时候SomeClass1已经被free了。谁写程序会那么写?趁早该行吧!
yuanscar 2005-08-18
  • 打赏
  • 举报
回复
zzlingaaa(小舟):看看finally的帮助再说,finally是遇到异常后执行的。怎么会中断
fuzhong 2005-08-18
  • 打赏
  • 举报
回复
赞成 zzlingaaa(小舟) hqhhh(枫叶)
hellolongbin 2005-08-18
  • 打赏
  • 举报
回复
如果非要说有问题的话,我建议把SomeClass2和SomeClass1的释放顺序颠倒一下,如果你的程序中SomeClass1和SomeClass2 有关系的话
wasi 2005-08-18
  • 打赏
  • 举报
回复
SomeClass1 := TSomeClass.Create;
try
{ do some code }
try
SomeClass2 := TSomeClass.Create;
finally
if assigned(SomeClass2) then
SomeClass2.Free;
end;
finally
SomeClass1.Free;
end;
lw549 2005-08-18
  • 打赏
  • 举报
回复
//写一个例子,有兴趣的看一下

type
TTest = class
constructor Create;
destructor Destroy;override;
public
procedure Test1;
end;

constructor TTest.Create;
begin
inherited;
raise Exception.Create('Create');
end;



destructor TTest.Destroy;
begin
raise Exception.Create('Destroy');
inherited;
end;

procedure TTest.Test1;
begin
raise Exception.Create('Test1');
end;
///////////////////////////////////
//测试
var
T: TTest;
begin
TTest.Create;//这里将调用Destroy,后面的都没有执行
try
T.Test1;
finally
T.Free;
end;
end;
lw549 2005-08-18
  • 打赏
  • 举报
回复
SomeClass1 := TSomeClass.Create;
try
{ do some code }
try
SomeClass2 := TSomeClass.Create;//如果构造函数抛出异常,将调用析构函数,这样做还是不安全
finally
SomeClass2.Free;
end;
finally
SomeClass1.Free;
end;
lw549 2005-08-18
  • 打赏
  • 举报
回复
如果需要创建10个class,岂不是要嵌套10层try?搞笑
cncharles 2005-08-18
  • 打赏
  • 举报
回复
hqhhh(枫叶) 比较标准
ghy412 2005-08-18
  • 打赏
  • 举报
回复
支持hqhhh(枫叶),不论在什么情况下都能释放SomeClass1和SomeClass2。
hthunter 2005-08-18
  • 打赏
  • 举报
回复
一般情况下楼主那样的写法就没问题的了,但是如果是自定义的类、create和free方法重载或者重写过的话,如果考虑到create或者free方法也有可能出现异常,最好能做相应的控制
winxkm 2005-08-17
  • 打赏
  • 举报
回复
建议你把你的实例代码贴出来
winxkm 2005-08-17
  • 打赏
  • 举报
回复
呵呵!没有找出病因·
hqhhh 2005-08-17
  • 打赏
  • 举报
回复
标准应该是下面这样:
SomeClass1 := TSomeClass.Create;
try
{ do some code }
try
SomeClass2 := TSomeClass.Create;
finally
SomeClass2.Free;
end;
finally
SomeClass1.Free;
end;
boatzm 2005-08-17
  • 打赏
  • 举报
回复
安全
zzlingaaa 2005-08-17
  • 打赏
  • 举报
回复
SomeClass1创建成功以后,SomeClass2的创建出现异常,就会导致SomeClass1没有释放就退出过程...一家之言...
Monkeycn 2005-08-17
  • 打赏
  • 举报
回复
当然完全了,这是delphi帮助里面推荐使用的方法啊
hanlin2004 2005-08-17
  • 打赏
  • 举报
回复
怎么不安全了?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧