getter(按值)方法的异常安全保证是什么?

时间:2015-09-24 10:28:58

标签: c++ exception exception-safety

对于以下示例类,getter方法的exception safety保证是什么?

这种吸气方法是否提供了最低限度的保证?

按值返回基本类型总是提供无投保证吗?

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;
}

2 个答案:

答案 0 :(得分:3)

根本不保证例外安全。

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

如果内存不足,

getC()可能会抛出std::bad_alloc。同上getB()getD()getE()

答案 1 :(得分:2)

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

这些Foo方法没有修改const的任何部分,因此主要关注的是新创建的vector的泄漏 - 如果存在异常,则应自动解除分配将成员从ce复制到返回值。

必须正确初始化a的原因是复制未初始化的数据可能会引发Itanium等体系结构,如Bathsheba's answer中所述。