Давайте я для простоты расскажу только про unique_ptr. Вот у нас есть код.
Obj* p = new Obj;
…
delete obj;
Если мы забываем про delete, память начинает течь. Если мы делаем слишком ранний delete, мы обращаемся к удалённому объекту. И тут помогает главная фишка Си++ — автодеструкторы.
u_p<Obj> p { new Obj };
// И делай с ним что хочешь, удалится автоматически
Вот несколько мест, где без u_p тяжело.
1. Функция возвращает объект, а разрушить должен пользователь.
u_p<ImportIssues> getImportIssues();
2. Мы создаём объект виртуального класса и обращаемся к нему.
class Father{
public:
virtual ~Father();
};
class Son : public Father{};
class AnotherSon : public Father{};
u_p<Father> someObj { new Son };
3. Вообще работа с объектами, которые где-то появляются и где-то исчезают и потому приходится держать как указатели.
std::vector<std::unique_ptr<QThread>> backJobs;