每日一练-2021-9-17

描述

来源:牛客-不定项选择题

下列选项哪些是正确的

A. 对于 unordered_map 和 map 这两个容器,迭代器的有效性皆不受删除操作影响

B. 对于 unordered_map 和 map 这两个容器,迭代器的有效性皆不受插入操作影响

C. 为了保证代码的异常安全性,应该避免在构造函数中抛异常

D. 为了保证代码的异常安全性,应该避免在析构函数中抛异常

答案及解析

正确选项:D

解析

A. 当unordered_map 和 map 某迭代器it指向的元素被删除时,只有该迭代器it失效,其他的迭代器不会失效

B. map 插入时不会引起迭代器失效;unordered_map 插入时一般情况下不会引起迭代器失效,只有当容器增长到需要rehash时,原来的所有迭代器失效

C. 构造函数抛出异常后,已经构造的成员对象会被逆序析构,申请的内存资源会被系统释放,不会调用析构函数。而且构造函数抛出异常是唯一表明构造失败的方法

D. effective C++ “ 条款08:别让异常逃离析构函数 ” 指出来如果析构函数抛出异常,对于 vector 这样的一个对象数组,如果第一个 Widget 析构有异常抛出,这时候还要销毁数组中剩下的 Widget 否则会造成内存泄漏,但是如果剩下的 Widget 析构时也抛出异常,就会两个异常同时存在,程序如果不是结束执行就会产生不明确行为。即使不是使用容器或数组,在析构函数中抛出异常也可能导致程序过早结束或不明确行为