Итак, я бы хотел использовать умные указатели вместо raw, и почти каждая тема в SO говорит о библиотеке Boost. Но у std есть такие вещи как std::auto_ptr
а также std::shared_ptr
,
Почему Boost? В чем разница?
Речь шла не о разнице в реализации, а о причинах использования указателей Boost. Я полагаю, что данный ответ, включая дату ответа и контекст, является достаточно полезным. Это помогает понять, как указатели Boost были добавлены в std.
В основном Boost сделал shared_ptr
первый. Вы можете заметить, что многие из новых контейнерных классов в C ++ 11 были в Boost давно. Я ожидаю, что этот шаблон будет продолжен и в следующих версиях стандарта C ++. Boost поддерживает старые компиляторы C ++, которые не говорят на C ++ 11, что является большим преимуществом.
Кстати, любое использование std::auto_ptr
Настоятельно не рекомендуется (прямой запрет. Многие считают, что любое использование std::auto_ptr
быть ошибкой.) и std::auto_ptr
устарела в C ++ 11 и удалена в C ++ 17.
Что приносит std::shared_ptr
а также std::unique_ptr
вместо этого, которые оба значительно более полезны.
Смотрите также:
Что ж, std::shared_ptr
а также boost:shared_ptr
оба указателя подсчета ссылок. Вместо этого std :: auto_ptr работает совсем по-другому. Разница между std::shared_ptr
а также boost:shared_ptr
очень маленький и в основном исторический. До C ++ 11 не было std::shared_ptr
и только boost:shared_ptr
, Когда C ++ 11 был разработан, они взяли boost:shared_ptr
как модель.
Все ваши упомянутые умные указатели имеют общее, что у них есть свой собственный механизм, обеспечивающий правильное управление временем жизни для точек. auto_ptr
работает так, что если у вас есть несколько экземпляров auto_ptr
тогда только один из них содержит указатель на реальный объект. Всякий раз, когда вы создаете auto_ptr
От другого auto_ptr
, тогда новый укажет на объект, а старый на NULL
, С другой стороны, с shared_ptr
может быть несколько shared_ptr
экземпляры, которые совместно используют один и тот же объект, только когда последний выходит из области видимости, только тогда объект удаляется.
В C ++ 11 есть аналогичный тип указателя на std::auto_ptr
а именно std::unique_ptr
, но есть некоторые важные различия, см. также
std :: auto_ptr в std :: unique_ptr.
Рекомендации: