Functions
F.27
Используйте `shared_ptr<T>` для разделения владения
Причина
Использование std::shared_ptr — стандартный способ представить разделяемое владение. То есть последний владелец удаляет объект.
Пример
{
shared_ptr<const Image> im { read_image(somewhere) };
std::thread t0 {shade, args0, top_left, im};
std::thread t1 {shade, args1, top_right, im};
std::thread t2 {shade, args2, bottom_left, im};
std::thread t3 {shade, args3, bottom_right, im};
// отсоединение потоков требует особой осторожности (например, присоединения до
// завершения main), но даже если мы отсоединим четыре потока здесь ...
}
// ... shared_ptr гарантирует, что в конечном счёте последний завершившийся
// поток безопасно удалит изображение
Примечание
Предпочитайте unique_ptr вместо shared_ptr, если одновременно существует не более одного владельца. shared_ptr — для разделяемого владения.
Заметьте, что повсеместное использование shared_ptr имеет стоимость (атомарные операции над счётчиком ссылок shared_ptr имеют измеримую совокупную стоимость).
Альтернатива
Пусть один объект владеет разделяемым объектом (например, объект с областью видимости) и уничтожает его (предпочтительно неявно), когда все пользователи завершили работу.
Контроль
(Не применимо к автоматической проверке) Это слишком сложный паттерн для надёжного обнаружения.