警告:变量未初始化

时间:2019-09-19 09:39:23

标签: c++ variables initialization

我有以下代码:

WHERE
Month(StartDate) <= Month(getdate()) AND YEAR(StartDate) <= YEAR(getdate()) 
AND (
    (Month(EndDate) >= Month(getdate()) AND YEAR(EndDate) >= YEAR(getdate()) )
    OR EndDate IS NULL
)

我总是收到警告,说变量class circularList { public: circularList() : data(0), next(this) {} public: int data; circularList* next; }; int main() { circularList* root = new circularList; } 尚未初始化,但是我可以查看是否运行了以指针circularList* next的地址初始化的代码。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

data2实际上在data1之后初始化(这会产生另一个警告),并且以thisthis->XXX开头的表达式会提示进行检查。在您的情况下,->XXX不存在,这会使分析仪感到困惑。这应该是一种回归,因为某些较旧的编译器版本(与VS2005或VS2008一样旧),或某些非常古老的gcclcc(不稳定的版本)也表达了类似的担忧。

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

答案 2 :(得分:-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";
}