exponenta event banner

Элемент не инициализирован в конструкторе

Конструктор не инициализирует некоторые члены класса

Описание

Этот дефект возникает, когда конструктор класса имеет по крайней мере один путь выполнения, по которому он не инициализирует некоторые элементы данных класса.

Дефект не появляется в следующих случаях:

  • Пустые конструкторы.

  • Неинициализированный элемент не используется в коде.

Риск

Элементы, не инициализированные конструктором, могут иметь непреднамеренные значения при их последующем чтении.

Инициализация всех элементов в конструкторе упрощает использование класса. При вызове отдельного метода для инициализации участников и последующего их чтения можно избежать неинициализации значений. Однако пользователь, использующий класс, может прочитать член класса перед вызовом метода инициализации. Поскольку конструктор вызывается при создании объекта класса, при инициализации всех элементов в конструкторе они не могут иметь неинициализированных значений в дальнейшем.

Зафиксировать

Рекомендуется инициализировать все элементы в конструкторе, предпочтительно в списке инициализации.

Примеры

развернуть все

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
    }
}

В этом примере, если flag не равно 0, элемент _c не инициализирован.

Дефект появляется на закрывающей скобке конструктора. Ниже приведены некоторые советы по навигации в исходном коде:

  • На панели Сведения о результате (Result Details) просмотрите, какие элементы не инициализированы.

  • Чтобы перейти к определению класса, щелкните правой кнопкой мыши элемент, инициализированный в конструкторе. Выберите «Перейти к определению». В определении класса можно увидеть все элементы, включая те, которые не инициализированы в конструкторе.

Исправление - инициализация всех членов на всех путях выполнения

Одной из возможных корректировок является инициализация всех членов класса. MyClass для всех значений flag.

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
        _c = 'b';
    }
}

Информация о результатах

Группа: Объектно-ориентированная
Язык: C++
По умолчанию: Откл.
Синтаксис командной строки: NON_INIT_MEMBER
Воздействие: среднее
CWE ID: 456, 457, 908
Представлен в R2015b