Каковы эквивалентные применения каждого умного указателя по сравнению с аналогичными (но не ограничиваясь ими) некоторыми передовыми методами с использованием исходных указателей?
Мое понимание минимально, но из того, что я могу собрать:
- 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 указал, что интеллектуальные указатели должны использоваться как простые абстракции для управления ресурсами; какие объекты области видимости объекта, которые не могут быть созданы в куче в точке объявления, но должны быть созданы позднее?