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

Какая точка std:: unique_ptr:: get

Не побеждает ли std::unique_ptr::get цель иметь уникальный_ptr в первую очередь? Я бы ожидал, что эта функция изменит свое состояние, чтобы он не содержал больше указателя. Существует ли фактическое полезное использование std:: unique_ptr:: get?

4b9b3361

Ответ 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.