C++ c++;构造函数中的异常安全

C++ c++;构造函数中的异常安全,c++,exception,c++11,shared-ptr,unique-ptr,C++,Exception,C++11,Shared Ptr,Unique Ptr,下面的代码呢 MyClass a(new Foo(), new Bar()); 如果“new Foo()”成功,但“new Bar()”抛出,Foo会泄漏吗 正在 std::unique_ptr<Foo> std::unique\u ptr 或 std::共享 作为参数,是否足以防止泄漏 如果“new Foo()”成功,但“new Bar()”抛出,Foo是否会泄漏 对 以[…]为参数是否足以防止泄漏 不一定。这取决于传递参数的方式。例如,假设您的类构造函数如下所示: MyC

下面的代码呢

MyClass a(new Foo(), new Bar());
如果“new Foo()”成功,但“new Bar()”抛出,Foo会泄漏吗

正在

std::unique_ptr<Foo>
std::unique\u ptr

std::共享
作为参数,是否足以防止泄漏

如果“new Foo()”成功,但“new Bar()”抛出,Foo是否会泄漏

以[…]为参数是否足以防止泄漏

不一定。这取决于传递参数的方式。例如,假设您的类构造函数如下所示:

MyClass::MyClass(std::unique_ptr<Foo> foo, std::unique_ptr<Bar> bar)

现在不可能发生泄漏,因为
std::make_unique()
(和
std::make_shared()
)立即将它们创建的对象关联到相应的智能指针,而无需这两个操作(智能指针的动态分配和构造)与其他操作交错。

@ dRaooo:很高兴它帮助:)dRiooo: C++委员会说,在C++ 11标准中不包括代码> MaxIOxION/<代码>是因为他们仅仅忘记了。与
共享
相比,编写起来非常简单,所以他们发现程序员会自己编写。我认为他们专注于与手动
shared\u ptr
构建相比,试图提高性能的
make\u shared
。是的,我认为make\u shared的主要优势只是性能改进,但阅读这个答案,不仅仅是简单的性能提升。
MyClass::MyClass(std::unique_ptr<Foo> foo, std::unique_ptr<Bar> bar)
MyClass a(std::unique_ptr<Foo>(new Foo()), std::unique_ptr<Bar>(new Bar())
MyClass a(std::make_unique<Foo>(), std::make_unique<Bar>());