Shared_ptr и unique_ptr за исключением
Типичное использование 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
уникальна, гарантия может быть дана, поскольку мы знаем, что только она держит указатель.