С ++ - это все о владении памятью - также известной как семантика владения .
Владелец блока динамически выделяемой памяти несет ответственность за освобождение этой памяти. Таким образом, действительно возникает вопрос, кому принадлежит память.
В C ++ владение документировано типом, внутри которого заключен необработанный указатель, поэтому в хорошей (IMO) программе на C ++ очень редко ( редко , не никогда ) можно увидеть переданные необработанные указатели (поскольку исходные указатели не имеют предполагаемого владения, поэтому мы можем не указывать, кому принадлежит память, и, таким образом, без внимательного прочтения документации нельзя сказать, кто несет ответственность за владение).
И наоборот, редко можно увидеть необработанные указатели, хранящиеся в классе, каждый необработанный указатель хранится в своей собственной оболочке интеллектуального указателя. ( NB: если у вас нет объекта, вы не должны хранить его, потому что вы не можете знать, когда он выйдет из области видимости и будет уничтожен.)
Итак, вопрос:
- С какой семантикой типа собственности сталкивались люди?
- Какие стандартные классы используются для реализации этой семантики?
- В каких ситуациях вы считаете их полезными?
Давайте сохраним 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>
в ситуациях, когда может произойти цикл указателей.
Использование: используется для остановки циклов от сохранения объектов, когда только цикл поддерживает общий счетчик ссылок.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Можно ли это перефразировать? Я вообще этого не понимаю.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
, Указатели RAW не имеют семантики владения. Если вы не знаете владельца, вы не знаете, кто несет ответственность за удаление объекта. Существует несколько стандартных классов, которые используются для переноса указателей (std :: shared_ptr, std :: unique_ptr и т. Д.), Которые определяют право собственности и, следовательно, определить, кто отвечает за удаление указателя.