C++ 当构造函数参数为';s堆分配抛出c++;

C++ 当构造函数参数为';s堆分配抛出c++;,c++,memory-leaks,C++,Memory Leaks,在第17项中,有一个函数调用可能泄漏的示例: processWidget (std::tr1::shared_ptr<Widget> ( new Widget ), priority ()); processWidget(std::tr1::shared_ptr(新Widget),priority()); 根据这本书,如果第一次创建新的小部件,就会发生泄漏。然后调用priority,但它抛出,在这种情况下,共享指针从未创建,新的小部件泄漏 据我所知,这样的电话不会泄露: proc

在第17项中,有一个函数调用可能泄漏的示例:

processWidget (std::tr1::shared_ptr<Widget> ( new Widget ), priority ());
processWidget(std::tr1::shared_ptr(新Widget),priority());
根据这本书,如果第一次创建新的小部件,就会发生泄漏。然后调用priority,但它抛出,在这种情况下,共享指针从未创建,新的小部件泄漏

据我所知,这样的电话不会泄露:

processWidget (std::tr1::shared_ptr<Widget> ( new Widget ));
processWidget(std::tr1::shared_ptr(新Widget));
但在这种情况下,如果新的小部件抛出,为什么没有内存泄漏呢?或者这是唯一安全的方法(如果是的话,有什么不同?)

auto w=std::tr1::shared_ptr(新小部件);
进程窗口小部件(w);

如果
新窗口小部件
抛出,则内存将自动释放(如果它已尽可能分配内存);所以第二个例子很好


但是,无论如何,使用
make_shared
是个好主意,因为它只需为对象和引用计数分配一个块,就可以更有效地利用内存。

您好,谢谢您的回复。我知道这不会泄漏,但它实际上是如何工作的?智能指针将新对象作为参数,那么如果新对象抛出,那么如何使用此参数构造智能指针?@KJS:if
new
throws,则智能指针根本不构造;在这之前,程序会跳转到
catch
块。但是在这种情况下,新的小部件不会泄漏吗,因为智能指针负责释放它?@KJS:如果失败,新表达式本身负责释放内存。只有在新表达式完成后但智能指针取得所有权之前抛出某些内容时,才会发生泄漏。在第一个例子中可能会发生这种情况,但在第二个例子中不会发生。再次感谢!
auto w = std::tr1::shared_ptr<Widget> ( new Widget );
processWidget ( w );