Shared_ptr и unique_ptr за исключением

От en.cppreference.com

Типичное использование std::unique_ptr включает в себя:

  • обеспечение безопасности исключений для классов и функций, которые обрабатывают объекты с динамическим временем жизни, гарантируя удаление как при обычном выходе, так и при выходе из исключения

  • передача владения уникальными объектами с динамическим временем жизни в функции

  • приобретение прав собственности на уникальные объекты с динамическим временем жизни от функций

  • как тип элемента в контейнерах, учитывающих перемещение, таких как std::vector, которые содержат указатели на динамически размещаемые объекты (например, если требуется полиморфное поведение)

Я заинтересован в первом пункте.

Не упоминается для shared_ptr в cppreference.com. Я не могу найти сценарий, в котором shared_ptr не удаляется при возникновении исключения. Может ли кто-нибудь объяснить, существуют ли такие возможности?

2 ответа

Решение

Давайте посмотрим на пример, как, как std::unique_ptr может использоваться для обеспечения безопасности исключений:

someclass *ptr = new someclass;
...
delete ptr; // in case of exception we have problem

поэтому вместо этого мы должны использовать:

std::unique_ptr<someclass> ptr = std::make_unique<someclass>();
... // no problem

просто, безопасно и без накладных расходов.

Так может shared_ptr использоваться таким же образом, чтобы обеспечить исключительную безопасность? Да, оно может. Но это не должно происходить, так как он предназначен для разных целей и будет иметь ненужные накладные расходы. Таким образом, он не упоминается в качестве инструмента для таких случаев, но это не означает, что он не будет удалять принадлежащий объект, если он является единственным владельцем.

Как следует из названия, std::shared_ptr делится указателем. Если выброшено исключение и оставлена ​​область действия, общий указатель уничтожается, но при наличии другого std::shared_ptr где-то это копия, тогда основной указатель не удаляется, а просто уменьшается счетчик ссылок.

Вот почему они не могут гарантировать, что удаление произойдет. поскольку std::unique_ptr уникальна, гарантия может быть дана, поскольку мы знаем, что только она держит указатель.

Другие вопросы по тегам