В чем разница между автоматическими указателями и общими указателями в C ++ - PullRequest
8 голосов
/ 05 декабря 2011

Я слышал, что авто указатели владеют своим объектом, тогда как совместно используемые указатели могут иметь много объектов, указывающих на них. Почему мы не используем общие указатели все время.

По отношению к этому, что такое умные указатели, люди используют этот термин взаимозаменяемо с общими указателями. Они одинаковые?

Ответы [ 3 ]

18 голосов
/ 05 декабря 2011

std::auto_ptr - устаревшая устаревшая реализация исключительного владения указателем.Его заменили на std::unique_ptr в C ++ 11.Исключительное владение означает, что указатель принадлежит чему-то, а время жизни объекта привязано к времени жизни владельца.

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

Умный указатель - это термин, который охватывает все типы, которые ведут себя как указатели, но с добавленной (умной) семантикой,в отличие от необработанных T*unique_ptr, и shared_ptr являются умными указателями.

2 голосов
/ 05 декабря 2011

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

Кроме того, в архитектурах с несколькими ядрами ЦП атомное обновление счетчика ссылок может стать, по меньшей мере, не слишком дорогостоящим, а действительно очень дорогостоящим, если в настоящее время многоядерные устройства обращаются к одной и той же области памяти.

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

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

1 голос
/ 05 декабря 2011

Может быть много форм умных указателей. Boost инспирировал shared_ptr, который теперь находится в C ++ 11, является одним из них. Я предлагаю использовать shared_ptr почти во всех местах, где есть сомнения, вместо auto_ptr, который имеет много причуд.

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

См: http://www.gotw.ca/publications/using_auto_ptr_effectively.htm http://en.cppreference.com/w/cpp/memory/shared_ptr

...