警告:变量未初始化

Warning: variable is uninitialized

我有如下一段代码:

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

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

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

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

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

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

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

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

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