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
这样,析构函数只做一件事,并且可以防止在异常期间抛出异常(我假设这是您试图解决的问题)。 |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
rainer · 后台插入程序的初始化 1 年前 |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |