警告:变量未初始化

Warning: variable is uninitialized

本文关键字:初始化 变量 警告      更新时间:2023-10-16

我有以下一段代码:

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

我不断收到一条警告,说变量circularList* next未初始化,但我可以看到我是否运行使用指针root地址初始化的代码。

指针在示例中已明确初始化。这似乎是一个编译器错误,因为应该没有警告。您应该将其报告给维护者。

这是静态分析器的错误或错误功能。它的预期行为是对代码做出如下反应:

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

data2实际上是在data1(产生另一个警告(和以this开头的表达式之后初始化的,this->XXX提示检查。在您的情况下,->XXX不存在,它会混淆分析器。这应该是一种回归,因为一些旧编译器的版本(与VS2005或VS2008一样古老(,或者一些非常古老的gcclcc(不是稳定的版本(表达了类似的担忧。

仍然存在不应使用this的情况 - 如果存在虚拟继承,或者初始化尝试调用虚函数。

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";
}