Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是C++;集装箱例外安全吗?_C++_Containers - Fatal编程技术网

C++ 是C++;集装箱例外安全吗?

C++ 是C++;集装箱例外安全吗?,c++,containers,C++,Containers,我使用隐式构造函数和一个load()成员来输入属性,但也可以抛出异常 我的问题是:如果属性是日常的C++容器,如果在加载()/中发生异常,我会得到内存泄漏吗? 谢谢你的阅读 编辑:帮助澄清我的问题的示例代码 class One { public: std::vector<int> stuff; void load() { stuff.resize(13); stuff[0] = 43; std::bad_alloc

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

我的问题是:如果属性是日常的C++容器,如果在<代码>加载()/<代码>中发生异常,我会得到内存泄漏吗? 谢谢你的阅读

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

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)
    }
}
第一类
{
公众:
std::载体材料;
空荷载(){
调整大小(13);
stuff[0]=43;
std::bad_alloc ba;
throw ba;//这会导致内存泄漏吗?(就此类而言)
}
}

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

是的,容器是非常安全的。只要你不做像在堆上分配它们这样的把戏(没有异常安全的智能指针)或诸如此类的把戏,你就没事了。

是的,容器是异常安全的。只要你不做在堆上分配它们之类的恶作剧(安全智能指针无一例外),你就没事了。

因为你的问题没有说明太多,我的看法如下

如果使用
new/new[]
(在
load()
中)分配内存,则在引发异常时,必须使用
delete/delete[]
取消分配内存


如果您是作为一个自动变量进行分配,那么它们是异常安全的。

因为您的问题没有说明太多,下面是我的看法

如果使用
new/new[]
(在
load()
中)分配内存,则在引发异常时,必须使用
delete/delete[]
取消分配内存


如果您是作为自动变量进行分配,则它们是异常安全的。

容器本身是异常安全的。
但它还取决于放置在contain中的类型以及是否正确写入

i、 例:异常不应逃逸析构函数

本标准规定了以下容器和例外情况的保证:

23.2.1一般容器要求[容器.要求.一般] 第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()函数引发异常


容器本身是异常安全的。
但它还取决于放置在contain中的类型以及是否正确写入

i、 例:异常不应逃逸析构函数

本标准规定了以下容器和例外情况的保证:

23.2.1一般容器要求[容器.要求.一般] 第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()函数引发异常


什么是加载?没有标准的C++容器有这个成员。我想答案是:是的,标准容器是异常安全的。但是你能给你的问题添加一些有代表性的代码吗,这样我们就可以确切地知道你在说什么了?
container==standardcontainer
?@Billy:
load
自定义类的自定义成员@奥利:这是一个普通的问题,我没有任何代码可以分享@iammilind:是。@catfish:不清楚您是否有一个容器作为类的成员变量,或者该容器是否用于存储类的实例,以及
load()
member函数如何适合此函数。一些伪代码有助于澄清这一点。什么是
load
?没有标准的C++容器有这个成员。我想答案是:是的,标准容器是异常安全的。但是你能给你的问题添加一些有代表性的代码吗,这样我们就可以确切地知道你在说什么了?
container==standardcontainer
?@Billy:
load
自定义类的自定义成员@奥利:这是一个普通的问题,我没有任何代码可以分享@iammilind:是。@catfish:不清楚您是否有一个容器作为类的成员变量,或者该容器是否用于存储类的实例,以及
load()
member函数如何适合此函数。一些伪代码将有助于澄清这一点。