Разве std::unique_ptr::get
не побеждает цель уникального_ptr? Я бы ожидал, что эта функция изменит свое состояние, чтобы он не содержал больше указателя. Существует ли фактическое полезное использование std :: unique_ptr :: get?Какой смысл для std :: unique_ptr :: get
ответ
Вы можете использовать его каждый раз, когда нужно передать сырой указатель, скажем, функцию C:
std::unique_ptr<char[]> buffer(new char[1024]);
// ... fill the buffer
int rc = ::write(fd, buffer.get(), len);
Существует очевидная ситуация, когда вам нужно вызвать API C или плохо разработанный C++ API.
Почему C++ API был бы «плохо разработан», если он заставит вас использовать * специальную реализацию умного указателя? Даже если само API не претендует на владение указателем? –
Для «плохо спроектированных» читайте также «старые, с того момента, как интеллектуальные указатели находились в стандартной библиотеке/люди использовали Boost». –
@NicolBolas: Обычно я передаю const-ссылки или ссылки на функции, если эта ссылка умирает в конце вызова. Это делает код вызова немного более неудобным, например 'foo (* something)', но я думаю, что это лучший дизайн, чем использование указателей там, потому что он лучше защищает от ошибок функции-контракта, не устанавливая ограничений на тип указателя. –
Когда ваши руки связаны, и вы должны передать указатель на то, p.get()
читает лучше, чем &*p
.
Существует функция, которая изменяет состояние, так что unique_ptr
больше не содержит указатель, и его называют release
. Это в основном полезно для передачи права собственности другим интеллектуальным указателям, которые не обеспечивают прямую конструкцию из unique_ptr
. Любые другие риски использования утечки ресурса.
Правило, которое я придерживаюсь, заключается в следующем: если вызываемый человек не держит жизнь/владение, не передавайте ему умный указатель; скорее, передать исходную ссылку C++ (предпочтительный) или необработанный указатель. Я нахожу это более чистым и более гибким, чтобы отделить заботу о собственности от использования.
std::unique_ptr
обеспечивает безопасную семантику собственности. Однако это не исключает необходимости в указателях, не являющихся владельцами. std::shared_ptr
имеет партнера, не являющегося владельцем, std::weak_ptr
. Необработанные указатели работают как бездокументарная копия std::unique_ptr
.
Herb Sutter имеет хорошее объяснение (около 3:40) https://www.youtube.com/watch?v=JfmTagWcqoE
Основное преимущество заключается в том, что уникальный указатель отслеживает, сколько другие ссылки есть на этот указатель. Вы работаете только с уникальным указателем, когда работаете с владением. Когда вы хотите что-то сделать с данными с этим указателем, вы передаете необработанный указатель.
Что делать, если вы хотите передать указатель на объект в библиотеку, например, любой вызов ОС? –
Вот [пример использования для получения] (http://codereview.stackexchange.com/questions/4679/shared-ptr-and-file-for-wrapping-cstdio-update-also-dlfcn-h). –
Вы можете делать 'std :: addressof (* p)' в любом случае. Нет необходимости делать вид, что основной указатель здесь нет. –