fo_*_*fo_ 17 c++ smart-pointers c++11
有关智能指针的MSDN页面包含有关在参数列表中创建智能指针的提升警告:
始终在单独的代码行上创建智能指针,从不在参数列表中创建智能指针,以便由于某些参数列表分配规则而不会发生细微的资源泄漏.
它所指的参数列表分配规则是什么?在什么情况下会发生资源泄漏?
它指的是以不同顺序评估参数的可能性,例如
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.
此外,
f(std::shared_ptr<int>(new int(42)), g())如果g抛出异常,代码可能会导致内存泄漏,因为g()可能new int(42)在构造函数之前和之后调用shared_ptr<int>.这不会发生f(std::make_shared<int>(42), g()),因为两个函数调用永远不会交错.
如果你这样做:
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