2012-05-29 5 views
40

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

+1

Что делать, если вы хотите передать указатель на объект в библиотеку, например, любой вызов ОС? –

+2

Вот [пример использования для получения] (http://codereview.stackexchange.com/questions/4679/shared-ptr-and-file-for-wrapping-cstdio-update-also-dlfcn-h). –

+1

Вы можете делать 'std :: addressof (* p)' в любом случае. Нет необходимости делать вид, что основной указатель здесь нет. –

ответ

45

Вы можете использовать его каждый раз, когда нужно передать сырой указатель, скажем, функцию C:

std::unique_ptr<char[]> buffer(new char[1024]); 
// ... fill the buffer 
int rc = ::write(fd, buffer.get(), len); 
0

Существует очевидная ситуация, когда вам нужно вызвать API C или плохо разработанный C++ API.

+7

Почему C++ API был бы «плохо разработан», если он заставит вас использовать * специальную реализацию умного указателя? Даже если само API не претендует на владение указателем? –

+1

Для «плохо спроектированных» читайте также «старые, с того момента, как интеллектуальные указатели находились в стандартной библиотеке/люди использовали Boost». –

+1

@NicolBolas: Обычно я передаю const-ссылки или ссылки на функции, если эта ссылка умирает в конце вызова. Это делает код вызова немного более неудобным, например 'foo (* something)', но я думаю, что это лучший дизайн, чем использование указателей там, потому что он лучше защищает от ошибок функции-контракта, не устанавливая ограничений на тип указателя. –

13

Когда ваши руки связаны, и вы должны передать указатель на то, p.get() читает лучше, чем &*p.

Существует функция, которая изменяет состояние, так что unique_ptr больше не содержит указатель, и его называют release. Это в основном полезно для передачи права собственности другим интеллектуальным указателям, которые не обеспечивают прямую конструкцию из unique_ptr. Любые другие риски использования утечки ресурса.

17

Правило, которое я придерживаюсь, заключается в следующем: если вызываемый человек не держит жизнь/владение, не передавайте ему умный указатель; скорее, передать исходную ссылку C++ (предпочтительный) или необработанный указатель. Я нахожу это более чистым и более гибким, чтобы отделить заботу о собственности от использования.

26

std::unique_ptr обеспечивает безопасную семантику собственности. Однако это не исключает необходимости в указателях, не являющихся владельцами. std::shared_ptr имеет партнера, не являющегося владельцем, std::weak_ptr. Необработанные указатели работают как бездокументарная копия std::unique_ptr.

1

Herb Sutter имеет хорошее объяснение (около 3:40) https://www.youtube.com/watch?v=JfmTagWcqoE

Основное преимущество заключается в том, что уникальный указатель отслеживает, сколько другие ссылки есть на этот указатель. Вы работаете только с уникальным указателем, когда работаете с владением. Когда вы хотите что-то сделать с данными с этим указателем, вы передаете необработанный указатель.