2

对于以下示例类,getter 方法的异常安全保证是什么?

这样的 getter 方法是否提供了最低限度的强有力保证?

按值返回基本类型是否总是提供不抛出保证?

class Foo
{
public:

    // TODO: Constructor

    // Getter methods
    int getA() const { return a; }
    std::string getB() const { return b; }
    std::vector<int> getC() const { return c; }
    Bar getD() const { return d; }
    std::vector<Bar> getE() const { return e; }

protected:
    int a;
    std::string b;
    std::vector<int> c;
    Bar d;
    std::vector<Bar> e;
}
4

2 回答 2

3

根本无法保证异常安全。

例如,getA()如果未初始化,可能会抛出异常a(或为此做任何其他事情,因为行为未定义)。如果读取了未初始化的变量,某些芯片(例如 Itanium)会发出信号。

getC()std::bad_alloc如果您的内存不足,可能会抛出。同上getB()getD()getE()

于 2015-09-24T10:32:32.160 回答
2

我认为您的所有操作都满足强异常安全性,前提是(在相关的情况下)Bar(const Bar&)复制构造函数是高度安全的。此外,getA将满足 nothrow 保证,前提是a已初始化,例如在构造函数中。

Foo这些方法没有修改任何部分const,因此主要关注的是新创建的 s 的泄漏- 如果在从返回值复制成员或将成员复制到返回值vector时出现异常,这些应该自动释放。ce

必须正确初始化的原因a是复制未初始化的数据可能会抛出诸如安腾之类的架构,如Bathsheba 的回答中所述。

于 2015-09-25T11:25:21.417 回答