@egorggegor

Где используются умные указатели?

Изучаю умные указатели, понял, что они делают и как работают, но никак не могу понять для чего они все-таки нужны.
Где и когда можно использовать unique_ptr, shared_ptr, weak_ptr ?
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
@Griglapidus
C++/Qt
В целом они нужны что бы ненужно было думать об освобождении ресурсов вручную.
unique_ptr - просто хранит динамический объект, когда будет уничтожен unique_ptr он автоматически освободит память с этим объектом.
shared_ptr нужен когда есть несколько объектов работающих с одним экземпляром. shared_ptr указывающие на один и тот же объект сами считают свое количество и память будет очищена при уничтожении последнего.
weak_ptr нужен если существует два объекта хранящих умные указатели друг на друга. Если их обоих сделать shared_ptr то программа не очистит память при попытке удалить один из них, так как уйдет в бесконечную рекурсию в попытке удалить их. Для решения есть weak_ptr он просто следит за своим объектом и не мешает его удалению, но может принять право владения если не будет других shared_ptr.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
RabraBabr
@RabraBabr
Я как опытный фрезеровщик могу сказать - не надо ими пользоваться нигде и никогда. Мои три пальца тому доказательство.

Потому, что они безопасны, а сырые указатели ведут к тому, что память течет (как минимум). Исторически так сложилось, что программисты боролись с этим. Они велосипедили умные указатели, потом это попало в boost, а потом и в стандартную библиотеку.

Насчет где и когда - вам в паттерны проектирования.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Давайте я для простоты расскажу только про 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;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы