Std:: unique_ptr vs std:: shared_ptr vs std:: weak_ptr vs std:: auto_ptr vs raw указатели
Каковы эквивалентные применения каждого умного указателя по сравнению с аналогичными (но не ограничиваясь ими) некоторыми передовыми методами с использованием исходных указателей?
Мое понимание минимально, но из того, что я могу собрать:
- Raw Указатели: Используйте, только если действительно, действительно, действительно, знаете, что вы делаете, и тщательно скрывали использование интерфейса.
- 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;
Синглтоны с передачей владения:
class Keyboard {
public:
//...
static Keyboard* CreateKeyboard();
~Keyboard();
//...
private:
//...
Keyboard();
static Keyboard* _instance;
//...
};
Агрегированные контейнеры, без владения: Пространственные графики разбиения и деревья, итерационные контейнеры и т.д.
Составные контейнеры, собственность: Большие объекты.
- EDIT -
Когда я работаю, я столкнулся с интересным делом, DeadMG указал, что интеллектуальные указатели должны использоваться как простые абстракции для управления ресурсами; какие объекты области видимости объекта, которые не могут быть созданы в куче в точке объявления, но должны быть созданы позднее?
Ответы
Ответ 1
какой идиомой является каждый умный указатель, который должен заменить?
Каждый из них, когда-либо, в конечном итоге включал уничтожение указанного ресурса. Иными словами, практически все они. Я не могу думать о каких-либо идиомах, связанных с необработанными указателями, которые не связаны с уничтожением остроконечного ресурса. Каждое другое использование - это не идиома, а просто "Использование указателя".