In cppref http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared,以下情况直到 C++17 才成立:
代码如f(std::shared_ptr<int>(new int(42)), g())
会导致
内存泄漏如果g
之后被呼叫new int(42)
并抛出一个
例外,同时f(std::make_shared<int>(42), g())
是安全的,因为
两个函数调用永远不会交错。
我想知道 C++17 中引入的哪些更改导致此不再适用。
函数参数的计算顺序更改为P0400R0 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0400r0.html.
在更改之前,函数参数的计算相对于彼此是无序的。这意味着评估g()
可以插入到评估中std::shared_ptr<int>(new int(42))
,这会导致您引用的上下文中描述的情况。
更改后,函数参数的求值将不确定地排序,没有交错,这意味着函数参数的所有副作用std::shared_ptr<int>(new int(42))
发生在那些之前或之后g()
。现在考虑这样的情况g()
可能会抛出。
无论哪种情况,无论如何都不会再出现内存泄漏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)