警告:变量未初始化
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
之后初始化(这会产生另一个警告)并且以 this
、this->XXX
开头的表达式会提示检查。在你的情况下 ->XXX
不存在,它会混淆分析器。这应该是一个回归,因为一些旧编译器的构建(与 VS2005 或 VS2008 一样古老),或者一些非常古老的 gcc
或 lcc
(不稳定的构建)表达了类似的担忧。
仍然存在不应该使用 this
的情况 - 如果存在虚拟继承,或者如果初始化尝试调用虚函数。
我有如下一段代码:
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
之后初始化(这会产生另一个警告)并且以 this
、this->XXX
开头的表达式会提示检查。在你的情况下 ->XXX
不存在,它会混淆分析器。这应该是一个回归,因为一些旧编译器的构建(与 VS2005 或 VS2008 一样古老),或者一些非常古老的 gcc
或 lcc
(不稳定的构建)表达了类似的担忧。
仍然存在不应该使用 this
的情况 - 如果存在虚拟继承,或者如果初始化尝试调用虚函数。