Людям не следует доверять распределитель памяти 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 .