我使用隐式构造函数和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)
}
}
我知道这是一个愚蠢的问题,但我不得不问它。
答案 0 :(得分:10)
容器本身是例外安全的 但它还取决于放置在包含中的类型以及是否已正确写入。
即:异常不应该逃避析构函数
该标准定义了对容器和例外的以下保证:
第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[]
解除分配。
如果您要分配为自动变量,那么它们是异常安全的。