Что такое умный указатель и когда я должен его использовать? - PullRequest
1629 голосов
/ 20 сентября 2008

Что такое умный указатель и когда его следует использовать?

Ответы [ 13 ]

3 голосов
/ 13 июня 2017

Умный указатель - это класс, оболочка обычного указателя. В отличие от обычных указателей, жизненный цикл смарт-точки основан на подсчете ссылок (сколько раз назначается объект интеллектуального указателя). Поэтому, когда умный указатель назначается другому, внутренний счетчик ссылок плюс плюс. И всякий раз, когда объект выходит из области видимости, счетчик ссылок минус минус.

Автоматический указатель, хотя выглядит похожим, полностью отличается от интеллектуального указателя. Это удобный класс, который освобождает ресурс всякий раз, когда объект автоматического указателя выходит из области видимости переменной. В некоторой степени это делает указатель (на динамически выделенную память) похожим на переменную стека (статически выделяется во время компиляции).

2 голосов
/ 07 ноября 2016

Интеллектуальные указатели - это те, где вам не нужно беспокоиться о перераспределении памяти, распределении ресурсов и передаче.

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

1 голос
/ 26 января 2018

Существующие ответы хороши, но не охватывают, что делать, если умный указатель не является (полным) ответом на проблему, которую вы пытаетесь решить.

Среди прочего (объяснено в других ответах) использование умного указателя является возможным решением Как мы можем использовать абстрактный класс в качестве возвращаемого типа функции? , который был помечен как дубликат этого вопрос. Тем не менее, первый вопрос, который нужно задать, если возникает желание указать абстрактный (или фактически любой) базовый класс в качестве возвращаемого типа в C ++, это «что вы на самом деле имеете в виду?». Хорошее обсуждение (с дальнейшими ссылками) идиоматического объектно-ориентированного программирования на C ++ (и как это отличается от других языков) в документации библиотеки контейнеров повышающих указателей . Таким образом, в C ++ вы должны думать о владении. Какие умные указатели помогают вам, но не являются единственным решением или всегда полным решением (они не дают вам полиморфную копию) и не всегда являются решением, которое вы хотите показать в своем интерфейсе (а возвращаемая функция звучит ужасно очень похоже на интерфейс). Например, может быть достаточно вернуть ссылку. Но во всех этих случаях (умный указатель, контейнер указателя или просто возвращение ссылки) вы изменили возвращаемое значение с значение на некоторую форму ссылка . Если вам действительно нужна копия, вам может потребоваться добавить больше шаблонной «идиомы» или перейти от идиоматического (или иного) ООП в C ++ к более универсальному полиморфизму, используя такие библиотеки, как Adobe Poly или Boost.TypeErasure .

...