C ++容器是否异常安全?

时间:2011-07-10 17:35:37

标签: c++ containers

我使用隐式构造函数和load()成员来输入属性,但也可以抛出异常。

我的问题是:如果属性是每天C ++容器,如果load()中发生异常,我会得到内存泄漏吗?

感谢您的阅读。

编辑:示例代码,以帮助澄清我的问题。

class One
{
public:
    std::vector<int> stuff;

    void load() {
        stuff.resize(13);
        stuff[0] = 43;

        std::bad_alloc ba;
        throw ba; // will this cause memory leaks? (as far as this class is concerned)
    }
}

我知道这是一个愚蠢的问题,但我不得不问它。

3 个答案:

答案 0 :(得分:10)

容器本身是例外安全的 但它还取决于放置在包含中的类型以及是否已正确写入。

即:异常不应该逃避析构函数

该标准定义了对容器和例外的以下保证:

23.2.1一般容器要求[container.requirements.general]

第10段:

  

除非另有规定(见23.2.4.1,23.2.5.1,23.3.3.4和23.3.6.5),本条款中定义的所有容器类型均符合以下附加要求:
   - 如果插入单个元素时insert()函数抛出异常,则该函数无效    - 如果push_back()或push_front()函数抛出异常,则该函数无效    - 没有erase(),clear(),pop_back()或pop_front()函数抛出异常    - 没有复制构造函数或返回迭代器的赋值运算符会抛出异常    - 没有swap()函数抛出异常。

答案 1 :(得分:1)

是的,容器是异常安全的。只要你没有做像在堆上分配它们的恶作剧(没有异常安全的智能指针)或类似的东西,你就没事了。

答案 2 :(得分:0)

由于你的问题没有说明,这是我的看法。

如果使用new/new[](在load()内)分配内存,则必须在抛出异常时使用delete/delete[]解除分配。

如果您要分配为自动变量,那么它们是异常安全的。