智能指针和参数列表分配规则

fo_*_*fo_ 17 c++ smart-pointers c++11

有关智能指针的MSDN页面包含有关在参数列表中创建智能指针的提升警告:

始终在单独的代码行上创建智能指针,从不在参数列表中创建智能指针,以便由于某些参数列表分配规则而不会发生细微的资源泄漏.

它所指的参数列表分配规则是什么?在什么情况下会发生资源泄漏?

Mar*_* A. 9

它指的是以不同顺序评估参数的可能性,例如

func(unique_ptr<MyClass>(new MyClass), a(), b());
Run Code Online (Sandbox Code Playgroud)

如果评价的顺序是:a(),MyClass(),b(),然后unique_ptr构造,它可能发生b()罚球和内存会被泄露.

一个安全措施(已在C++ 14中添加并且它也更有效)是使用make_unique(假设MSVC并根据您的编译器版本,您可能必须自己定义一个或在这里查看).这同样适用于shared_ptr.

在这里看一下std :: make_shared的注释:

此外,f(std::shared_ptr<int>(new int(42)), g())如果g抛出异常,代码可能会导致内存泄漏,因为g()可能new int(42)在构造函数之前和之后调用shared_ptr<int>.这不会发生f(std::make_shared<int>(42), g()),因为两个函数调用永远不会交错.


Joh*_*nck 5

如果你这样做:

func(shared_ptr<Foo>(new Foo), shared_ptr<Bar>(new Bar));
Run Code Online (Sandbox Code Playgroud)

签名是:

void func(shared_ptr<Foo>, shared_ptr<Bar>);
Run Code Online (Sandbox Code Playgroud)

如果其中一个构造函数抛出异常会发生什么?可能会发生new已经成功调用一次然后另一个失败的情况(您不知道哪个会先被调用)。如果发生这种情况,其中一个对象可能会泄漏,因为它从未被资源管理器持有。

您可以在此处阅读更多信息:http : //www.gotw.ca/gotw/056.htm