C++为什么在一个表达式中最多只执行一次显式资源分配

本篇内容主要讲解“C++为什么在一个表达式中最多只执行一次显式资源分配”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++为什么在一个表达式中最多只执行一次显式资源分配”吧!

R.13: 在一个表达式中最多只执行一次显式资源分配

Reason(原因)

如果你在一个表达式中执行两次(或以上的)资源分配,由于包括函数参数在内的子表达式的执行顺序是没有定义的,因此可能导致资源泄露。

Example(示例)

void fun(shared_ptr<Widget> sp1, shared_ptr<Widget> sp2);

函数可能被这样调用:

// BAD: potential leak
fun(shared_ptr<Widget>(new Widget(a, b)), shared_ptr<Widget>(new Widget(c, d)));

因为编译器可能会调整构建函数参数的两个表达式的执行顺序,这段代码在发生异常时会出问题。通常,编译器会交错执行两个表达式:(使用new进行)两个对象的内存分配可能首先进行,接下来调用两个Widget的构造函数。如果一个调用某个构造函数是抛出异常,那么另一个就永远不会被释放。

这个不易察觉的问题有一个简单的解决方案:永远不在一个表达式中执行两次(含两次)以上的显式资源分配。例如:

shared_ptr<Widget> sp1(new Widget(a, b)); // Better, but messy
fun(sp1, new Widget(c, d));

最好的解决方案是使用返回管理对象的工厂方法彻底避免显式资源分配。

fun(make_shared<Widget>(a, b), make_shared<Widget>(c, d)); // Best

如果目前还不存在,那就自己写工厂包装类。

Enforcement(实施建议)

  • 标记具有多个显式分配资源的表达式(问题是:我们可以识别出多少显式分配资源的情况?)

到此,相信大家对“C++为什么在一个表达式中最多只执行一次显式资源分配”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!