Для меня эти 3 вида удовлетворяют большинство моих потребностей:
shared_ptr
- считаемый на ссылку, освобождение, когда счетчик достигает нуля
weak_ptr
- то же как выше, но это - 'ведомое устройство' для shared_ptr
, не может освободить
auto_ptr
- когда создание и освобождение происходят в той же функции, или когда объект нужно считать one-owner-only когда-либо. Когда Вы присваиваете один указатель на другого, вторые 'кражи' объект сначала.
у меня есть своя собственная реализация для них, но они также доступны в Boost
.
я все еще передаю объекты ссылкой (const
каждый раз, когда возможный), в этом случае вызываемый метод должен предположить, что объект жив только во время вызова.
существует другой вид указателя, что я использую это, я звоню hub_ptr. Именно, когда у Вас есть объект, должно быть доступным от объектов, вложенных в нем (обычно как виртуальный базовый класс). Это могло быть решено путем передачи weak_ptr
им, но это не имеет shared_ptr
к себе. Поскольку это знает, что эти объекты не жили бы дольше, чем он, это передает hub_ptr им (это - просто шаблонная обертка к регулярному указателю).
C++ В большинстве модулей, я видел, по умолчанию, что предполагалось, что получение указателей было не владение получения. На самом деле функции/методы, отказывающиеся от владения указателя, были и очень редки и явно выразили тот факт в своей документации.
Эта модель предполагает, что пользователь является владельцем только того, что он явно выделяет . От всего остального автоматически избавляются (в выходе объема, или через RAII). Это - подобная C модель, расширенная фактом, большинство указателей принадлежит объектам, которые освободят их автоматически или, когда необходимый (при упомянутом разрушении объектов, главным образом), и что срок службы объектов предсказуем (RAII является Вашим другом, снова).
В этой модели, необработанные указатели свободно циркулируют и главным образом не опасные (но если разработчик будет достаточно умен, он будет использовать ссылки вместо этого каждый раз, когда возможный).
C++ В коде, полном интеллектуальных указателей, пользователь может надеяться проигнорировать время жизни объектов. Владелец никогда не является пользовательским кодом: Это - сам интеллектуальный указатель (RAII, снова). проблема состоит в том, что циклические ссылки смешались со ссылкой, считаемые интеллектуальные указатели могут быть смертельны , таким образом, необходимо иметь дело оба и с совместно использованными указателями и со слабыми указателями. Таким образом, у Вас есть все еще владение для рассмотрения (слабый указатель ни на что не мог указать, даже если его преимущество перед необработанным указателем состоит в том, что это может сказать Вам так).
weak_ptr
Не имейте совместно использованного владения. Если Вы делаете, удостоверьтесь, что это только с кодом, которым Вы не управляете.
, Который решает 100% проблем, так как они вынуждают Вас понять, как все взаимодействует.
, Когда ресурс совместно используется несколькими объектами. Повышение shared_ptr использует подсчет ссылок, чтобы удостовериться, что ресурс освобожден, когда все - finsihed.
std::tr1::shared_ptr<Blah>
довольно часто Ваш лучший выбор.
От повышения, существует также контейнер указателя библиотека. Они немного более эффективны и легче использовать, чем стандартный контейнер интеллектуальных указателей при только использовании объектов в контексте их контейнера.
В Windows, существуют указатели COM (IUnknown, IDispatch и друзья), и различные интеллектуальные указатели для обработки их (например, ATL CComPtr и интеллектуальные указатели, автоматически сгенерированные оператором "импорта" в Visual Studio на основе класс _com_ptr ).
Я не думаю, что когда-либо имел возможность совместно использовать владение в своем дизайне. На самом деле от вершины моей головы единственный допустимый случай, о котором я могу думать, является шаблоном В наилегчайшем весе.
, Когда необходимо выделить память динамично, но хотеть быть уверенными, что это освобождено на каждой точке выхода блока.
я нахожу это полезным, поскольку это может легко быть переустановлено и выпущено, никогда не имея необходимость волноваться об утечке
Существует другая часто используемая форма единственного передаваемого владельца, и желательно к auto_ptr
, потому что она избегает проблем, вызванных auto_ptr
безумное повреждение семантики присвоения.
я не говорю ни о ком другом, чем swap
. Любой тип с подходящим swap
функция может быть задумана как умная ссылка к некоторому содержанию, которым это владеет до тех пор, пока владение передается другому экземпляру того же типа путем свопинга их. Каждый экземпляр сохраняет свои идентификационные данные, но связывается с новым содержанием. Это похоже безопасно rebindable ссылка.
(Это - умная ссылка, а не интеллектуальный указатель, потому что Вы не должны явно разыменовывать его для достигания содержания.)
Это означает, что auto_ptr становится менее необходимым - только необходимо заполнить разрывы, где типы не имеют пользы swap
функция. Но все контейнеры станд. делают.
yasper:: ptr является легким весом, повышением:: shared_ptr как альтернатива. Это работает хорошо в моем (на данный момент) маленький проект.
В веб-странице в http://yasper.sourceforge.net/ это описано следующим образом:
, Почему запись другой интеллектуальный указатель C++? Там уже существуют несколько высококачественных реализаций интеллектуального указателя для C++, наиболее заметно пантеон указателя Повышения и SmartPtr Loki. Для хорошего сравнения реализаций интеллектуального указателя и когда их использование будет соответствующим, считайте Herb Sutter Новый C++: Умные (er) Указатели. В отличие от расширяемых функций других библиотек, Yasper является узко сфокусированным указателем подсчета ссылок. Это соответствует тесно shared_ptr Повышения и политикам Loki RefCounted/AllowConversion. Yasper позволяет программистам на C++ забывать об управлении памятью, не представляя большие зависимости Повышения или имея необходимость узнать о сложных шаблонах политики Loki. Философия
* small (contained in single header) * simple (nothing fancy in the code, easy to understand) * maximum compatibility (drop in replacement for dumb pointers)
последняя точка может быть опасной, так как yasper разрешает опасный (все же полезный) действия (такие как присвоение на необработанные указатели и ручной выпуск) запрещенный другими реализациями. Будьте осторожны, только используйте те функции, если Вы знаете то, что Вы делаете!
, Когда создатель объекта хочет явно вручить владение кому-то еще. Это - также способ документировать в коде, я даю это Вам, и я больше не отслеживаю его, так удостоверьтесь, что Вы удаляете его, когда Вы закончены.