# V1110. Constructor of a class inherited from 'QObject' does not use a pointer to a parent object.

Анализатор обнаружил унаследованный от '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);
      };
    };

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-772