Розумні вказівники для дітей
Смарт - класи покажчиків std::unique_ptr
і std::shared_ptr
призначені для управління пам'яттю. Наявність такого розумного вказівника означає, що ви є власником вказівника. Однак при створенні QObject
або похідному типі з QObject
батьком право власності (відповідальність за прибирання) передається батькові QObject
. У цьому випадку стандартні бібліотечні розумні вказівники непотрібні або навіть небезпечні, оскільки вони можуть призвести до подвійного видалення. Так!
Сирі вказівники на дітей-сиріт
Однак, коли QObject
(або похідний тип) створюється в купі без батьківського файлу, QObject
речі дуже сильно відрізняються. У цьому випадку вам слід не просто тримати вказівник raw, але розумний вказівник, бажано a std::unique_ptr
на об’єкт. Таким чином ви отримуєте безпеку ресурсів. Якщо згодом ви передасте право власності на об’єкт батькові, яким QObject
ви можете скористатися std::unique_ptr<T>::release()
, приблизно так:
auto obj = std::make_unique<MyObject>();
QObject parentObject;
obj->setParent( &parentObject );
obj.release();
Якщо речі, які ви робите перед тим, як дати батькові-сироті батьків, видає виняток, тоді у вас буде витік пам'яті, якщо ви використовували необроблений вказівник для утримання об'єкта. Але наведений вище код заощаджує від такого витоку.
На більш загальній ноті
Це не сучасна порада на C ++ - уникати сирих покажчиків разом, а уникати володіння необробленими вказівниками. Я можу додати ще одну сучасну пораду на C ++: не використовуйте розумні вказівники на об'єкти, які належать якійсь іншій сутності програми.