Анализатор обнаружил унаследованный от 'QObject' класс, конструктор которого принимает в качестве параметра указатель на 'QObject', но не использует его для организации связи "родитель — ребёнок".
Производные от типа 'QObject' объекты организуются в деревья со связями "родитель — ребёнок". При создании очередного объекта передаётся указатель на объект-родитель. В объекте-родителе создающийся объект добавляется в список дочерних. Благодаря этому, когда произойдёт удаление родительского объекта, также удалятся и все его дочерние объекты.
Рассмотрим пример:
class BadExample : public QObject { public: BadExample(QObject *parent) : ui(new UI::BadExample) { ui->setupUi(this); }; };
В конструктор класса 'BadExample' передаётся указатель на родительский объект. Однако он не передаётся в конструктор базового класса и не используется внутри тела конструктора.
Исправленный пример:
class GoodExample1 : public QObject { public: GoodExample1(QObject *parent) : QObject (parent), ui(new UI::GoodExample) { /*....*/ }; };
Анализатор не выдаст предупреждение в следующих случаях.
Случай N1. Параметр безымянный. Это значит, что программист не хочет отдавать управление объектом в систему отслеживания Qt:
class GoodExample2 : public QObject { public: GoodExample2(QObject *) { /* .... */ }; };
Случай N2. Параметр сознательно не используется для организации связи "родитель — ребёнок". В конструктор родительского класса явно передаётся нулевой указатель:
class GoodExample3 : public QObject { public: GoodExample3(QObject *parent) : QObject { nullptr } { /* .... */ }; };
Случай N3. Параметр передаётся в функцию QObject::setParent:
class GoodExample4 : public QObject { public: GoodExample4(QObject *parent) { setParent(parent); }; };
Данная диагностика классифицируется как: