x**n 发帖数: 461 | 1 请教各位高手:
其他的语言例如Java, C#有try/catch/finally,可是C++只有try/catch。如何能够简
单实现 try/catch/finally 呢?
还有,为什么C++不实现这个功能?我想一定有其原因的,有没有高手指点一下。 |
p***o 发帖数: 1252 | 2 析构函数
【在 x**n 的大作中提到】 : 请教各位高手: : 其他的语言例如Java, C#有try/catch/finally,可是C++只有try/catch。如何能够简 : 单实现 try/catch/finally 呢? : 还有,为什么C++不实现这个功能?我想一定有其原因的,有没有高手指点一下。
|
x**n 发帖数: 461 | 3 这个恐怕不行,假如在一个function里面的临时作了memory allocation,然后有
exception,在这种情况下destructor肯定不起作用。
【在 p***o 的大作中提到】 : 析构函数
|
p***o 发帖数: 1252 | 4 What are you talking about?
For exception safety, you should always wrap memory allocations, e.g. by
using smart pointers.
【在 x**n 的大作中提到】 : 这个恐怕不行,假如在一个function里面的临时作了memory allocation,然后有 : exception,在这种情况下destructor肯定不起作用。
|
x**n 发帖数: 461 | 5 I am not talking about memory management, I am talking about exception
handling.
【在 p***o 的大作中提到】 : What are you talking about? : For exception safety, you should always wrap memory allocations, e.g. by : using smart pointers.
|
p***o 发帖数: 1252 | 6 异常处理的目的不是处理异常,而是管理资源的生存期,以及更广泛地说对象的一致性。
生存期的话,用析构函数就好,和finally有些类似。一致性就不是这里三言两语能说
清楚的了。
【在 x**n 的大作中提到】 : I am not talking about memory management, I am talking about exception : handling.
|
g*****g 发帖数: 34805 | 7 最大的问题是如果在catch里出现了新的异常,没有finally的话
不能保证资源得到释放吧。
性。
【在 p***o 的大作中提到】 : 异常处理的目的不是处理异常,而是管理资源的生存期,以及更广泛地说对象的一致性。 : 生存期的话,用析构函数就好,和finally有些类似。一致性就不是这里三言两语能说 : 清楚的了。
|
p***o 发帖数: 1252 | 8 catch里可以往外抛异常把。
对于析构函数,stack unwinding的时候出异常的话,程序直接就结束了。
【在 g*****g 的大作中提到】 : 最大的问题是如果在catch里出现了新的异常,没有finally的话 : 不能保证资源得到释放吧。 : : 性。
|
x**n 发帖数: 461 | 9 关键就是我想要一个象finally一样的机制,可以保证资源释放,同时程序又不要太难
看。
微软有一个__try{}__finally{} extension,是不是我可以把try{}catch{} block放在
__try{} block里面,不知道这样有没有问题?
如果不是在微软环境下,而是standard C++下,那又该怎么办呢?
【在 g*****g 的大作中提到】 : 最大的问题是如果在catch里出现了新的异常,没有finally的话 : 不能保证资源得到释放吧。 : : 性。
|
t****t 发帖数: 6806 | 10 C++ exception的资源释放一般是通过自动变量的destructor自动做的, 就是说不管什
么理由离开了这个scope, 那么auto variable的dtor就会被调用. 这个就相当于
finally.
【在 x**n 的大作中提到】 : 关键就是我想要一个象finally一样的机制,可以保证资源释放,同时程序又不要太难 : 看。 : 微软有一个__try{}__finally{} extension,是不是我可以把try{}catch{} block放在 : __try{} block里面,不知道这样有没有问题? : 如果不是在微软环境下,而是standard C++下,那又该怎么办呢?
|
|
|
x**n 发帖数: 461 | 11 而且我确实不明白,对一个local scope的资源,destructor能帮上什么忙? |
g*****g 发帖数: 34805 | 12 This sounds problemic. try catch finally is always in the same function,
so in finally it's easy to release any resource try may have opened.
destructor does not have access to local variables of other functions.
【在 t****t 的大作中提到】 : C++ exception的资源释放一般是通过自动变量的destructor自动做的, 就是说不管什 : 么理由离开了这个scope, 那么auto variable的dtor就会被调用. 这个就相当于 : finally.
|
x**n 发帖数: 461 | 13 是不是应该用object来把resource封装起来,因为object的destructor最终反正会被调
用的,资源会在那里自然释放。
【在 x**n 的大作中提到】 : 而且我确实不明白,对一个local scope的资源,destructor能帮上什么忙?
|
t****t 发帖数: 6806 | 14 是这个意思.
【在 x**n 的大作中提到】 : 是不是应该用object来把resource封装起来,因为object的destructor最终反正会被调 : 用的,资源会在那里自然释放。
|
x**n 发帖数: 461 | 15 明白了,就像我刚想到的那样,多谢你们三个的帮助。
【在 t****t 的大作中提到】 : C++ exception的资源释放一般是通过自动变量的destructor自动做的, 就是说不管什 : 么理由离开了这个scope, 那么auto variable的dtor就会被调用. 这个就相当于 : finally.
|
t****t 发帖数: 6806 | 16 auto variable always stays in the same function as well.
oh, auto variable == your local variable.
【在 g*****g 的大作中提到】 : This sounds problemic. try catch finally is always in the same function, : so in finally it's easy to release any resource try may have opened. : destructor does not have access to local variables of other functions.
|
x**n 发帖数: 461 | 17 还是觉得finally的机制可能更好一些。要不然需要自己写一些非常tricky的class,当
然,如果只是memory,boost做的很好了,但对custom resource,这是一个很头疼的问
题。
【在 t****t 的大作中提到】 : auto variable always stays in the same function as well. : oh, auto variable == your local variable.
|
t****t 发帖数: 6806 | 18 finally用起来当然爽一些, 但是有时容易忘记. 包装起来绝对不存在这个问题, 不过
包装的时候会不会忘记就是另外一回事了.
【在 x**n 的大作中提到】 : 还是觉得finally的机制可能更好一些。要不然需要自己写一些非常tricky的class,当 : 然,如果只是memory,boost做的很好了,但对custom resource,这是一个很头疼的问 : 题。
|
x**n 发帖数: 461 | 19 包装的时候当然不会忘记的,这都忘记了肯定该打屁股。
问题是ownership和reference count,特别是如果变态不让用boost的话,那就很惨了。
【在 t****t 的大作中提到】 : finally用起来当然爽一些, 但是有时容易忘记. 包装起来绝对不存在这个问题, 不过 : 包装的时候会不会忘记就是另外一回事了.
|
t****t 发帖数: 6806 | 20 什么都不给用也不行啊. boost不能用的话, tr1让不让用啊? tr1不让用的话, stl是不
是也不能用啊...
了。
【在 x**n 的大作中提到】 : 包装的时候当然不会忘记的,这都忘记了肯定该打屁股。 : 问题是ownership和reference count,特别是如果变态不让用boost的话,那就很惨了。
|
|
|
x**n 发帖数: 461 | 21 那可难说了,俺们这里可是有雪儿级别的。还好,即使我每天跟他吵架,他也把我没辙。
不过这几个中间,还是觉得boost最好用。而且特别烦ms的extension。
【在 t****t 的大作中提到】 : 什么都不给用也不行啊. boost不能用的话, tr1让不让用啊? tr1不让用的话, stl是不 : 是也不能用啊... : : 了。
|
p***o 发帖数: 1252 | 22 你要是只用一种compiler,把boost里相关的部分扒出来自己实现一下也不麻烦,做工程
估计不会用到boost里面那些变态的部分把 ...
辙。
【在 x**n 的大作中提到】 : 那可难说了,俺们这里可是有雪儿级别的。还好,即使我每天跟他吵架,他也把我没辙。 : 不过这几个中间,还是觉得boost最好用。而且特别烦ms的extension。
|
h***i 发帖数: 1970 | 23 tr1是标准了,为啥不让用。g++的tr1中的shared pointer就是boost的实现。
辙。
【在 x**n 的大作中提到】 : 那可难说了,俺们这里可是有雪儿级别的。还好,即使我每天跟他吵架,他也把我没辙。 : 不过这几个中间,还是觉得boost最好用。而且特别烦ms的extension。
|
g*****y 发帖数: 7271 | 24 常用资源像memory,file之类的,自然有smart pointer,stream
之类的。不常用的资源,去看一看 ScopedGuard 一类的RAII design吧。例如 http://www.ddj.com/cpp/184403758
比finally好用多了。finally 主要是给没有deterministic destructor 的语言用的。
如果用到的资源比较多,还有dependency的话,能给人烦死。
【在 x**n 的大作中提到】 : 还是觉得finally的机制可能更好一些。要不然需要自己写一些非常tricky的class,当 : 然,如果只是memory,boost做的很好了,但对custom resource,这是一个很头疼的问 : 题。
|
h***i 发帖数: 1970 | 25 深表赞同,这种模式之所以叫idiom,不叫pattern,就是由于一些语言不支持
deterministic destructor
【在 g*****y 的大作中提到】 : 常用资源像memory,file之类的,自然有smart pointer,stream : 之类的。不常用的资源,去看一看 ScopedGuard 一类的RAII design吧。例如 http://www.ddj.com/cpp/184403758 : 比finally好用多了。finally 主要是给没有deterministic destructor 的语言用的。 : 如果用到的资源比较多,还有dependency的话,能给人烦死。
|