【问题标题】:Warning: variable is uninitialized警告:变量未初始化
【发布时间】:2019-09-19 09:39:23
【问题描述】:

我有以下代码:

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

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

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

【问题讨论】:

标签: c++ variables initialization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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

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

      【讨论】:

      • 我想创建一个循环列表,如果我有一个元素,我希望那个元素指向它自己
      • 已更正,并确保这不会发出警告。
      • this 在构造函数的成员初始化列表中有效
      • 是的,@Mat, gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36) 没有发出警告。
      • 仍然发出警告,我不明白为什么,因为它看起来对我来说已经初始化......
      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多