Людям не следует доверять распределитель памяти C++. Если вы пишете новый код с помощью new
и delete
, вы играете с огнем.
Еще во времена C программисты должны были усердно следить за тем, чтобы каждый созданный объект уничтожался в нужное время и чтобы после уничтожения объекта он больше никогда не использовался. Сегодня C++ стандартно поставляется с интеллектуальными указателями, благодаря которым подобные проблемы остались в прошлом. Самый полезный умный указатель — это unique_ptr
, о котором мы сегодня и поговорим.
unique_ptr
связывает время жизни указанного объекта с его собственным временем жизни. Когда unique_pointer
удаляется, он удаляет и свой указатель. Обычно это происходит, когда интеллектуальный указатель выходит за пределы области видимости (например, в конце функции) или сам интеллектуальный указатель удаляется (например, когда удаляется класс, содержащий его). Давайте посмотрим, как его использовать:
Объявление срока службы
Если вам просто нужно немного динамической памяти и вы хотите удалить ее, когда закончите, поместите ее в unique_ptr
:
Заявление о праве собственности
Вы можете использовать unique_ptr
для полей своего класса, чтобы убедиться, что они будут удалены при удалении экземпляра:
Передача права собственности
unique_ptr
нельзя скопировать; его можно только перемещать. Это позволяет вам писать функции, которые явно берут на себя владение переданными указателями:
Последние мысли
Существуют и другие типы интеллектуальных указателей. Наиболее распространенным является shared_ptr
, реализующий подсчет ссылок. shared_ptr
удалит свой указатель только в том случае, если на него больше никто не указывает. Это может быть полезно в некоторых сложных структурах данных, таких как связанные списки с общими концами. Есть также weak_ptr
, который знает, сколько владельцев у указателя, но на самом деле сам не считается владельцем.
Умные указатели помогут вам, только если вы позволите им. Если вы вызовете get()
на unique_pointer
, это не помешает вам вызвать delete
на указателе (что в основном гарантирует позже segfault). Однако, как говорится в заголовке этой статьи, если вы правильно используете интеллектуальные указатели, вы никогда ничего не delete
.