Подтвердить что ты не робот

Std:: shared_ptr Исключение безопасности

Я просто понял, прочитав эту страницу, что конструктор std:: shared_ptr с одним аргументом указателя не является исключением.

Следовательно, следующий код содержит возможную утечку памяти:

std::shared_ptr<int> p3 (new int);

Предполагается, что могут быть два распределения:

  • Первая перед вызовом конструктора
  • Второй в конструкторе shared_ptr (Это то, что происходит в VS 2012, например)

Два вопроса здесь:

Верно ли, что если второе выделение генерирует исключение, то происходит утечка памяти первого?

Если да, то:

Какая правильная идиома для использования std:: shared_ptr?

  • Использование make_shared
  • дающий право собственности на первое выделение на std:: unique_ptr, а затем передачу права собственности
  • Другие мысли?
4b9b3361

Ответ 1

template<class Y> explicit shared_ptr(Y* p);

20.7.2.2.1/6 Броски: bad_alloc или исключение, определяемое реализацией, когда невозможно получить ресурс, отличный от памяти.
20.7.2.2.1/7 Безопасность исключений: если выбрано исключение, вызывается delete p.

Нет, нет утечки памяти.

Ответ 2

Поздний ответ, но лучше использовать make_shared() для безопасности исключений, как указано в GotW # 102: Следующий код не является безопасным для исключений:

 f( std::shared_ptr<T1>{ new T1 }, std::shared_ptr<T2>{ new T2 } );

В то время как следующее:

f( std::make_shared<T1>(), std::make_shared<T2>() );