Я читал этот ответ, и автор ссылается на повысить передовые методы в котором говорится:
Избегайте использования неназванных временного файла 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 следует руководству по букве, тогда как плохая конструкция временного shared_ptr на месте, допуская возможность утечки памяти. поскольку аргументы функции оцениваются в неуказанном порядке, возможно для первого int (2), который будет оцениваться первым, g() второй, и мы никогда не сможем получить к конструктору shared_ptr, если g выбрасывает исключение. <... >
Проблема безопасности исключений, описанная выше, также может быть устранена используя функции make_shared или allocate_shared factory, определенные в повышение /make _shared.hpp. Эти функции factory также обеспечивают эффективность достигается за счет консолидации ассигнований.
Я предполагаю, что я начну использовать make_shared
, но мне было интересно, все еще ли эта рекомендация относится к С++ 11 shared_ptr
. Я спрашиваю, потому что я действительно не понимаю, почему это означает, что метать g()
не позволит вызвать вызов ctor.