【发布时间】:2015-02-28 12:12:05
【问题描述】:
我知道构造函数可以抛出异常,当坏事发生时这是一件好事。但是当构造函数抛出时,并且假设构造函数内部的所有资源都被妥善管理(例如使用RAII),哪一个是确切的异常保证(基本,强)?
详细来说,我正在记录我的代码并编写每个成员函数的异常保证(并尝试编写安全异常代码)。
例如,如果我有这样的课程:
struct A
{
std::string s;
A()
{
std::vector<int> v(5);
s = "some text";
/* do a lot of fascinating things */
if (error)
throw 1;
}
};
当构造函数抛出时,会调用v 和s 的析构函数,对吧?因此,感谢std::vector 和std::string 的析构函数,A 的构造函数不会泄漏任何资源,然后它至少提供了基本保证。我说的对吗?
我的问题是:我可以说这个构造函数提供了强有力的保证吗? 另外,构造函数的保证是否值得记录?
我的猜测:它确实有很强的保证。由于对象在尝试构造之前不存在,并且如果构造函数失败,则无论如何都不会创建对象,因此操作(构造对象)无效,一切都在构造函数开始之前留下。
如果我猜对了:
- 当构造函数只提供基本保证而不提供强保证时?
【问题讨论】:
-
“是否值得记录” - 所有函数都应提供异常安全性,因此除非您打算编写糟糕的代码,否则您不需要记录。跨度>
-
@CaptainObvlious 这不是我的意图 ;) 但是知道一个函数的实际保证是非常重要的,因为其他函数可以依赖它来保证自己的保证。我认为记录确切的异常保证并不是一个不好的做法,但我当然对构造函数不太确定。
标签: c++ exception constructor