我在 Stack Overflow 上读到全局/静态变量被初始化为它们的默认值 ( 0)。
我还在其他地方读到过(不确定),类变量(非静态)也被初始化为0. 这是真的?
具体来说,我想知道我的指针是否默认初始化为nullptr.
我试着在编译g++和clang两者似乎他们初始化nullptr。
#include <iostream>
struct Foo {
int *ptr;
};
int main() {
Foo f;
std::cout << f.ptr;
}
Run Code Online (Sandbox Code Playgroud)
打印:
0
如果只有我的编译器在做,有什么办法可以告诉我的编译器不要这样做(使用一些编译器标志)?
我还在其他地方读到过(不确定),类变量(非静态)也被初始化为 0。
无论你在哪里读到那个(如果你读到那个),那就停止阅读那个来源!
这是真的?
不。
这是一个简短的例子:
#include <iostream>
class Foo {
public:
int* ip; // Do we get default initialization to "nullptr" ?? ...
Foo() = default;
};
int main()
{
Foo Bar;
std::cout << Bar.ip << std::endl; // ... print the "ip" pointer to see!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用 clang-cl 构建并在 Windows 10 上运行时的输出是(但实际值不同):
00000272B7D941D0
Run Code Online (Sandbox Code Playgroud)
使用 MSVC 编译时,给出以下消息:
警告 C4700:使用了未初始化的局部变量“Bar”
当然,有些编译器可能会将这种未初始化的内存设置为零,即使使用 Clang 或 MSVC 构建时,如上所述,指针的初始值也可能偶尔会恰好为零。但是,应该认真对待来自 MSVC 的警告。此外,clang-cl 使用的静态分析器给出了更具体的警告:
std::cout << Bar.ip << std::endl;
^
warning GDEC5F24A: 1st function call argument is an uninitialized value [clang-analyzer-core.CallAndMessage]
Run Code Online (Sandbox Code Playgroud)
...有什么办法可以告诉我的编译器不要这样做(使用一些编译器标志)?
可能不会 - 但您可以启用所有编译器警告,这将显示您有此类行为的情况。
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |