Shared_ptr: что он использовал для

Я очень использую boost:: scoped_ptr в своем коде, и это здорово, но я в настоящее время работаю с программным обеспечением, которое использует shared_ptr повсюду, и мне интересно, не хватает ли я чего-то.

AFAIK shared_ptr полезен только в том случае, если разные потоки будут получать доступ к тем же данным, и вы не знаете, в каком порядке потоки будут завершены (с помощью shared_ptr, гарантирующего, что объект существует до окончания последнего потока она).

Существуют ли другие варианты использования?

Ответ 1

Темы здесь неактуальны. Что имеет значение, легко ли указать точку, в которой объект больше не используется.

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

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

Ответ 2

AFAIK shared_ptr полезен только тогда, когда разные потоки будут доступ к тем же данным

Ну, это для ситуаций, когда несколько владельцев владеют тем же объектом, на который указывает интеллектуальный указатель. Они могут обращаться к интеллектуальным указателям из разных потоков, а shared_ptr можно использовать в этой области, но это не главное. Если последний владелец теряет ссылку на объект, на который указывает, механизм shared_ptr удаляет объект.

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

Ответ 3

Разница между scoped_ptr и shared_ptr (и auto_ptr) в основном заключается в семантике копирования.

  • scoped_ptr для "" Назначение ресурсов - это инициализация" и не может быть скопирован (он не может использоваться совместно с другими экземплярами, и право собственности не может быть передано)
  • shared_ptr предназначен для автоматического восстановления памяти при совместном использовании нескольких сторон.
  • auto_ptr является копируемым (и передает права собственности при назначении)

Ответ 4

Другим важным различием между shared_ptr и scoped_ptr является то, что только shared_ptr работает со слабой_ptr. Слабые указатели используются для прерывания циклов общих указателей, что позволяет избежать утечек памяти, но weak_ptr можно использовать для большего, чем это.

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

Ответ 5

Как уже было сказано, shared_ptr касается совместного использования. Тем не менее, я бы сказал, что совместное владение, как правило, плохое (существуют исключения, такие как мухи), и лучше определить владельца и поместить туда scoped_ptr.

Ответ 6

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