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, а затем передачу права собственности
- Другие мысли?
Ответы
Ответ 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>() );