@sabn1k
Возможно я написал чепуху, но попытайтесь понять

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

Приветствую.
Собственно, начал читать книгу по STL, вначале идет краткий обзор C++11.
Очень понравились интеллектуальные указатели. Когда их стоит использовать и какой из них? Нужно ли, например, объявлять массив при помощи std::unique_ptr и т.д.
Спасибо.
  • Вопрос задан
  • 1502 просмотра
Пригласить эксперта
Ответы на вопрос 2
Nipheris
@Nipheris Куратор тега C++
Когда их стоит использовать

Умные указатели? - задан сегодня утром.

Нужно ли, например, объявлять массив при помощи std::unique_ptr и т.д.

В большинстве случаев лучше std::array для массивов размера, известного во время компиляции, и std::vector - если размер становится известен только при выполнении программы. Исключение - необходимость взаимодействия с кодом, использующим обычные указатели на массивы (в частности, с Сишным кодом).

и какой из них?

std::unique_ptr подразумевает одного владельца в один момент времени, и переход владения от одного умного указателя к другому (ownership transfer). std::shared_ptr использует подсчет ссылок, чтобы у объекта было несколько владельцев. Объект будет уничтожен, когда последний shared_ptr, указывающий на этот объект, будет уничтожен.

Разумеется, и та и другая стратегия работает только в умных указателях. Если вы скопируете содержимое умного указателя в обычный, и затем объект будет удален умным указателем, то обычный указатель продолжит указывать на тот же адрес в памяти. Это очевидная вещь, но именно на нее все напарываются поначалу.

Отдельно добавлю, что unique_ptr это один из способов моделирования композиции объектов (когда умирает владеющий объект, умирают и те, которыми он владеет), а shared_ptr - агрегации (если владеющий объект умирают, те, которыми он владел, продолжают жить, пока они нужны кому-то еще).
Ответ написан
Olej
@Olej
инженер, программист, преподаватель
Собственно, начал читать книгу по STL, вначале идет краткий обзор C++11.
Очень понравились интеллектуальные указатели. Когда их стоит использовать и какой из них?


С умными указателями нужно быть поосторожнее. Не всегда они уместны. Да и не являются они составной частью STL и никак и не лежали рядом с STL.

Вот есть такое мнение:

Нелегкая выпала доля тем, кто связал свою жизнь с программированием на языке Cи++. На мой взгляд, для изготовления Cи++ был изуродован прекраснейший язык Cи. Мало того, Cи++ мутирует чуть ли не каждый квартал, постепенно превращаясь в игрушку-трансформер, а сам автор Си++ вынужден выпускать одну книжку за другой для толкования своего детища. С внедрением языка Си++ в коммерческую разработку резко упала надежность программного обеспечения, что пользователи прочувствовали на своей шкуре. Чрезмерная избыточность языка Cи++ привела к тому, что один и тот же алгоритм каждый программист кодирует по-своему и, в соответствии с законами Мерфи и Питерса, не самым оптимальным способом.

Это в очень существенной мере относится к умным указателям.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы