C++ - это владение памятью - он же семантика владения.
Ответственность за освобождение этой памяти лежит на владельце куска динамически выделяемой памяти. Таким образом, возникает вопрос: кому принадлежит память?
В C++ владение задокументировано по типу, в который обернут необработанный указатель, поэтому в хорошей (IMO) C++ программе очень редко (редко, не раз) можно видеть, как необработанные указатели передаются (поскольку необработанные указатели не имеют никаких выводов). Таким образом, мы не можем сказать, кому принадлежит память, и, следовательно, без внимательного прочтения документации вы не сможете сказать, кто несет ответственность за владение.)
И наоборот, редко можно увидеть необработанные указатели, хранящиеся в классе, причем каждый необработанный указатель хранится в его собственной оболочке интеллектуальных указателей. (N.B.: Если у вас нет объекта, вам не следует его хранить, потому что вы не можете знать, когда он выйдет из области видимости и будет уничтожен.)
Итак, вопрос:
- С какими семантическими формами владения сталкиваются люди?
- Какие стандартные классы используются для реализации этой семантики?
- В каких ситуациях вы находите их полезными?
Позволяет сохранить 1 тип семантической собственности на ответ, чтобы за них можно было голосовать "за" и "против" индивидуально.
Резюме:
Концептуально умные указатели просты, а наивная реализация проста. Я видел много попыток реализации, но они неизменно ломаются, что не очевидно для случайного использования и примеров. Поэтому я рекомендую всегда использовать хорошо проверенные умные указатели из библиотеки, а не использовать собственные. std::auto_ptr
или один из умных указателей Boost, кажется, покрывает все мои потребности.
std::auto_ptr<T>
:
Один человек владеет объектом. Передача права собственности разрешена.
Использование: Это позволяет вам определять интерфейсы, которые показывают явную передачу прав собственности.
boost::scoped_ptr<T>
Один человек владеет объектом. Передача права собственности не допускается.
Использование: используется, чтобы показать явное владение. Объект будет уничтожен деструктором или при явном сбросе.
boost::shared_ptr<T>
(std::tr1::shared_ptr<T>
)
Многократное владение. Это простой указатель с подсчетом ссылок. Когда счетчик ссылок достигает нуля, объект уничтожается.
Использование: когда объект может иметь несколько владельцев со сроком службы, который не может быть определен во время компиляции.
boost::weak_ptr<T>
:
Используется с shared_ptr<T>
в ситуациях, когда может произойти цикл указателей.
Использование: Используется для остановки циклов от сохранения объектов, когда только цикл поддерживает общий счет.