![]() |
1
8
你几乎可以用
Herb Sutter比我解释的“几乎”更好: http://www.gotw.ca/gotw/047.htm
有一些角落的箱子
没有RAII你可能会更好,因为它与你的用例不匹配。RAII是指始终清理;是否例外。 您想要的要简单得多:只有在不抛出异常(这是一个简单的函数序列)时才释放资源。
|
![]() |
2
5
我会用另一种方式来做——如果没有异常,明确地告诉它做它的工作:
|
![]() |
3
3
这似乎规避了使用RAII的主要原因。RAII的要点是,如果在代码中间发生异常,您仍然可以释放资源/进行适当的销毁。 如果这不是你想要的语义,那么不要使用raii。 因此,而不是:
只做:
如果中间的代码抛出,则不会释放资源。这是您想要的,而不是保留RAII(和保留名称),但不实现RAII语义。 |
![]() |
4
0
看起来像bool std::uncaught_Exception();如果您希望对每个异常都使用这种行为,而不仅仅是特殊的行为,那么就可以使用这个技巧! |
![]() |
5
0
您可以不使用尝试捕获:
或者,你也可以用RAII更用力一点:
|
![]() |
6
0
虽然这充其量只是一个拼凑,但如果您拥有感兴趣的异常类的代码,您可以向该类(bool)添加一个静态数据成员,该成员在该类的对象的构造函数中设置为“true”,在析构函数中设置为“false”(可能需要改为递增/递减的int)。然后在raii类的析构函数中,可以检查std::uncaught_Exception(),如果为true,则查询异常类中的静态数据成员。如果返回true(或gt;0),则会得到其中一个异常——否则将忽略它。 不是很优雅,但它可能会起作用(只要你没有多个线程)。 |
![]() |
7
0
我发现这个网站上有一个关于std::uncaught_Exception()的有趣讨论,还有一个对你的问题的替代解决方案,对我来说更优雅、更正确: http://www.gotw.ca/gotw/047.htm
这样,析构函数只做一件事,并且可以防止在异常期间抛出异常(我假设这是您试图解决的问题)。 |
![]() |
Post Self · std::是否可以退出泄漏内存? 7 年前 |
![]() |
OneRaynyDay · 在这种情况下,我应该使用智能指针吗? 7 年前 |
![]() |
jcai · 对象的ctor和dtor必须在同一个线程上吗? 8 年前 |
![]() |
Stradigos · 防止解构宏中定义的匿名变量,直到作用域结束 8 年前 |
![]() |
user877329 · 通用句柄类 9 年前 |