请问以下两种释放资源的方式有何不同?(150分)

  • 主题发起人 主题发起人 kde
  • 开始时间 开始时间
K

kde

Unregistered / Unconfirmed
GUEST, unregistred user!
1. Stream := TStream.Create;
try
...
finally
Stream.Free;
end;

2. Stream := TStream.Create;
try
...(无跳转, Exit等语句)
except
end;
Stream.Free;
 
1、情况下调用 Free 后,如果有异常,异常将被再次 raise;
2、情况下如果 Execpt ... end 中的代码没有异常或异常不被再次 riase ,Free 将被调用,否则将跳过 Free!
 
出现错误的话
1、exception未捕获,继续throw到上层
2、exception已经捕获,不会显示错误窗口了
 
finally块最适合于释放先前分配的资源(诸如文件等),因为它总能执行的,
即使发生错误。而try...except是在你可能需要针对特定的异常作特定的处理,
这就要有到try...except来捕捉特定的异常。
 
对 Stream.Free 来说
1、2两种,都是只要进了try就能执行
 
照你上面的写法,都会执行呀?且结果也没有什么不同.
 
第一种写法是比较好的,因为不论是否有异常发生Stream都能被FREE
第二种写法就没那么好了,首先,Try except块比try finally耗资源,如果你在except
中处理异常时产生异常的话,Stream就不能被 FREE,再次,如果代码行数多了的时候,
很有可能在本来没有EXIT的地方加上了EXIT你也没注意到,对代码的可维护性也不好。
 
建议使用
stream:=tstream.create;
try
try
...
except
...
end;
finally
stream.free;
end;
但平时不要这么烦,只要用第一种方法就可以了。
如qkl所讲,第二种方法不可靠,不要这样使用,特别是编控件时,资源没释放也不知道

 
第二个最好这样写:
Stream := TStream.Create;
try
...(无跳转, Exit等语句)
except
...
Stream.Free;
end;
Stream.Free;
这样,在出错后执行except时也会正常的释放Stream,否则Stream不会被释放。
 
Pan Ying的方法可行。。
 
搞笑!!!

我的总结发言:

1. 必须用第一种,才能保证操作系统资源的正确分配和释放!

2. 告诉你们一个finally的特殊例:
try
if (条件) Then Exit
// AST
finally
showmessage('哈哈!必须经过我!')
// AAS
end;
即使在AST处满足条件执行Exit,最终也要执行AAS处的语句!
 
有种办法不执行
try
Halt;
finally
showmessage('哈哈!必须经过我!')

end;
 
第1中方法可靠
 
try....finally 无论怎么都执行FINALLY后的语句,
而当TRY.....except 是IF 。。THEN的关系
 
如果仅对资源释放来说,两种效果一样.
 
其實兩者的效果是一樣的(當然是在Except後沒有Raise語句),但是我們寫程序的時候
要多使用已經流行的寫法或者說是習慣.
那就要使用try ..finally
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=712578
这个问题对
try
except
end;

try
finally
end;大讨论
 
如果光是释放的话,没有区别,有区别是的是try....expect 和try......finally两种用法!
 
后退
顶部