2013-08-16 4 views
15

Каковы эквивалентные применения каждого умного указателя по сравнению с аналогичными (но не ограничиваясь ими) некоторыми передовыми методами с использованием необработанных указателей ?std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs raw указатели

Мое понимание минимально, но от того, что я могу собрать:

  • Сырье Pointers: только использовать, если вы действительно, действительно, действительно, действительно, знаете, что вы делаете и тщательно скрываемые использование позади интерфейс.
  • std :: auto_ptr: Устаревшие никогда не используют.
  • std :: unique_ptr: Указатель Singleton, который передает право собственности при назначении.
  • std :: shared_ptr: Ссылка указана указателем, который не передает право собственности на присваивание, но увеличивает счетчик ссылок. Когда все ссылки оставляют область видимости или явно std::shared_ptr::reset, вызывается базовый deallocator.
  • std :: weak_ptr: Подтип std::shared_ptr, который не увеличивает счетчик ссылок и недействителен, когда его родительский std::shared_ptr больше не существует. Может вернуться и недействительная ссылка. Всегда проверяйте перед использованием.

RAW POINTER ЭКВИВАЛЕНТНЫХ ПРИМЕРЫ

подсчет ссылок, реализаций кэша:std::map<std::string, std::pair<long, BITMAP*> > _cache;

Singletons с передачей права собственности:

class Keyboard { 
public: 
//... 
    static Keyboard* CreateKeyboard(); 
    ~Keyboard(); 
//... 
private: 
//... 
    Keyboard(); 
    static Keyboard* _instance; 
//... 
}; 

Совокупные Con нет, теперь возили собственности: пространственного разделения графы и дерева, итерационные контейнеров и т.д.

Композитных Контейнеры собственности: крупных объектов.

--EDIT--

Как я работаю, я наткнулся на интересный случай, DeadMG отметил, что умные указатели должны быть использованы в качестве простых абстракций ухаживают управления ресурсами; какие объекты области области, которые не могут быть созданы в куче в точке объявления, но должны быть созданы позднее?

+2

Я не понимаю, о чем вы просите. Как реализовать поведение смарт-указателя с помощью raw-указателей? –

+1

Я понятия не имею, что это за вопрос, но если вы вызываете «unique_ptr» указатель Singleton, я подозреваю, что у вас совершенно другое значение Singleton здесь. – Puppy

+0

@NeilKirk. На самом деле, что такое использование интеллектуальных указателей по сравнению с исходными указателями? то есть какой идиомой является каждый умный указатель, который должен заменить? – Casey

ответ

4

какой идиом каждый умный указатель должен заменить?

Каждый из них, когда-либо, который в конечном итоге включал уничтожение остроконечного ресурса. Иными словами, практически все они. Я не могу думать о каких-либо идиомах, связанных с необработанными указателями, которые не связаны с уничтожением остроконечного ресурса. Каждое другое использование на самом деле не является идиомой, это просто «Использование указателя».

+0

Совокупные контейнеры не уничтожают свои ресурсы с указанием ресурсов, они просто удаляют их из списка. Это главная проблема, которую я испытывал при изучении умных указателей, какой умный указатель был бы вероятным кандидатом на такое использование? – Casey

+0

@Casey: Если они не уничтожают свои ресурсы с указанием ресурсов, зачем им использовать умный указатель? Умные указатели предназначены для уничтожения вещей. – Puppy

+0

Хорошо, вот почему я был в замешательстве. Каждый человек, который защищал интеллектуальные указатели, которые я читал, яростно выступал против использования исходных указателей в любой форме или моде и должен был быть заменен умным указателем. – Casey

Смежные вопросы