std :: unique_ptr против std :: shared_ptr против std :: weak_ptr против std :: auto_ptr против необработанных указателей

Каково эквивалентное использование каждого интеллектуального указателя по сравнению с аналогичными (но не ограничивающимися) некоторыми продвинутыми методами, использующими необработанные указатели?

Мое понимание минимально, но из того, что я могу извлечь:

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

Эквивалентные примеры RAW-указателей

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

Синглтоны с передачей права собственности:

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

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

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

—РЕДАКТИРОВАТЬ—

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

17

Решение

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

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

5

Другие решения

Других решений пока нет …