避免使用未命名的 shared_ptr 临时对象来节省输入;要了解为什么这是危险的,请考虑以下示例:
void f(shared_ptr<int>, int);
int g();
void ok() {
shared_ptr<int> p(new int(2));
f(p, g());
}
void bad() {
f(shared_ptr<int>(new int(2)), g());
}
函数 ok 遵循信中的准则,而 bad 构造临时 shared_ptr 就地,承认内存泄漏的可能性。由于函数参数以未指定的顺序进行评估,因此可能首先评估 new int(2),然后评估 g(),如果 g 抛出异常,我们可能永远无法访问 shared_ptr 构造函数。<...>
上述异常安全问题也可以通过使用 boost/make_shared.hpp 中定义的 make_shared 或 allocate_shared 工厂函数来消除。这些工厂功能还通过合并分配提供了效率优势。
我想我会开始使用make_shared
,但我想知道这条建议是否仍然适用于 C++11 shared_ptr
。我问是因为我真的不完全理解为什么投掷g()
会阻止 ctor 被调用。