Не побеждает ли std::unique_ptr::get
цель иметь уникальный_ptr в первую очередь?
Я бы ожидал, что эта функция изменит свое состояние, чтобы он не содержал больше указателя.
Существует ли фактическое полезное использование std:: unique_ptr:: get?
Какая точка std:: unique_ptr:: get
Ответ 1
Вы используете его каждый раз, когда вам нужно передать необработанный указатель на, скажем, на функцию C:
std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
Ответ 2
std::unique_ptr
безопасно предоставляет уникальную семантику собственности. Однако это не исключает необходимости в указаниях, не связанных с владельцами. std::shared_ptr
имеет не принадлежащий ему экземпляр, std::weak_ptr
. Исходные указатели работают как std::unique_ptr
не владеющий экземпляр.
Ответ 3
Правило, которое я, как правило, придерживается, таково: если вызываемый человек не держит жизнь/право собственности, не передавайте ему умный указатель; скорее, передать исходную ссылку С++ (предпочтительный) или необработанный указатель. Я нахожу его более чистым и гибким, чтобы отделить заботу о собственности от использования.
Ответ 4
Когда ваши руки связаны, и вам нужно передать указатель на что-то, p.get()
читает лучше, чем &*p
.
Существует функция, которая изменяет состояние, так что unique_ptr
больше не содержит указатель, а его имя - release
. Это в основном полезно для передачи права собственности другим интеллектуальным указателям, которые не обеспечивают прямую конструкцию из unique_ptr
. Любые другие риски использования утечки ресурса.
Ответ 5
У Трава Саттера есть хорошее объяснение (около 3:40) https://www.youtube.com/watch?v=JfmTagWcqoE
Главное преимущество заключается в том, что уникальный указатель отслеживает, сколько других ссылок есть для этого указателя. Вы работаете только с уникальным указателем, когда работаете с владением. Когда вы хотите что-то сделать с данными с этим указателем, вы передаете необработанный указатель.
Ответ 6
Существует очевидная ситуация, когда вам нужно вызвать API C или плохо разработанный С++ API.