警告:变量未初始化

5

我有下面这段代码:

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

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

我一直收到警告,提示变量circularList* next未初始化,但是如果运行代码,我可以看到它被指针root的地址初始化了。


2
无法重现。请指定您使用的编译器和选项。 - Angew is no longer proud of SO
@Ovidiu Firescu,gcc HEAD 10.0.0没有发出警告。 - Vlad from Moscow
http://prntscr.com/p85izj - Ovidiu Firescu
XCode 也没有任何警告。 - ecotax
1
@OvidiuFirescu,请分享您的编译器版本。 - v78
显示剩余4条评论
3个回答

4
指针在示例中明确初始化。这似乎是编译器的错误,因为不应该有警告。您应该向维护者报告它。

3

这要么是静态分析工具的错误或缺陷。它所期望的行为是对这样的代码做出反应:

class circularList
{
public:
    circularList() : data2(0), data1(this->data2) {}
public:
    int data1;
    int data2;
};
data2实际上是在data1之后初始化的(这会产生另一个警告),以this或者this->XXX开头的表达式会提示检查。在你的情况下,没有出现->XXX,导致分析器混淆。这应该是一种回归,因为一些旧编译器(例如VS2005或VS2008的旧版本)或一些非稳定版本的gcclcc(非稳定版本)也表达了类似的担忧。

仍有一种情况不能使用this - 如果存在虚继承,或者如果初始化尝试调用虚函数。


-3

next(this) 不是一个好的选择,因为像这样传递 this 时,逻辑上并没有创建它。在构造函数块中使用 next = this 可能更好。

附注: 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";
}

1
我想创建一个循环列表,如果只有一个元素,我希望该元素指向自身。 - Ovidiu Firescu
已经修正,并确保不会出现警告。 - v78
5
"this" 在构造函数的成员初始化列表中是有效的。 - Mat
仍然会发出警告,我不明白为什么,因为在我的看来它已经被初始化了... - Ovidiu Firescu
this 只是一个指针,this 指向的对象是否已经完全存在在这里并不重要。 - 463035818_is_not_a_number
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接