Предупреждение: переменная неинициализирована - PullRequest
5 голосов
/ 19 сентября 2019

У меня есть следующий фрагмент кода:

class circularList
{
public:
    circularList() : data(0), next(this) {}
public:
    int data;
    circularList* next;
};

int main()
{
    circularList* root = new circularList;
}

Я получаю предупреждение о том, что переменная circularList* next не инициализирована, но я могу видеть, запускаю ли я код, инициализированный с адресомуказатель root.

Ответы [ 3 ]

4 голосов
/ 19 сентября 2019

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

3 голосов
/ 19 сентября 2019

Это либо ошибка, либо сбой статического анализатора.Предполагается, что поведение должно реагировать на код следующим образом:

class circularList
{
public:
    circularList() : data2(0), data1(this->data2) {}
public:
    int data1;
    int data2;
};

data2 фактически инициализируется после data1 (который выдает другое предупреждение), а выражение, начинающееся с this, this->XXX, вызывает проверку,В вашем случае ->XXX нет и это смущает анализатор.Это должно быть регрессом, потому что некоторые сборки более старых компиляторов (таких же старых, как VS2005 или VS2008), или некоторые очень древние gcc или lcc (не стабильные сборки) выражали аналогичные проблемы.

Существует ещеслучай, когда this не должен использоваться - если есть виртуальное наследование или если инициализация пытается вызвать виртуальную функцию.

0 голосов
/ 19 сентября 2019

next(this) должен быть неправильным выбором, поскольку this логически не создается при такой передаче.Возможно, вместо этого используйте next = this в блоке конструктора.

PS: gcc (GCC) 4.8.5 не выдал никакого предупреждения.

class circularList
{
public:
    circularList() : data(0) { next = this; }
public:
    int data;
    circularList* next;
};

int main()
{
    circularList* root = new circularList;
    std::cout << root->data << "\n";
    std::cout << root->next->data << "\n";
    root->data = 1;
    std::cout << root->data << "\n";
    std::cout << root->next->data << "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...