首页 > 解决方案 > 默认情况下,在结构/类中声明的指针是否初始化为 nullptr?

问题描述

我在 Stack Overflow 上读到全局/静态变量已初始化为其默认值 ( 0)。

我还在其他地方读到(不确定),类变量(非静态)也被初始化为0. 这是真的?

具体来说,我想知道我的指针是否默认初始化为nullptr.

我尝试编译g++并且clang两者似乎都将它们初始化为nullptr.

#include <iostream>

struct Foo {
    int *ptr;
};

int main() {
    Foo f;
    std::cout << f.ptr;
}

打印:

0

如果只有我的编译器在做,有什么办法可以告诉我的编译器不要这样做(使用一些编译器标志)?

标签: c++

解决方案


我还在其他地方读过(不确定),类变量(非静态)也被初始化为 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;
}

使用 clang-cl 构建并在 Windows 10 上运行时的输出是(但实际值会有所不同):

00000272B7D941D0

使用 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]

...有什么办法可以告诉我的编译器不要这样做(使用一些编译器标志)?

可能不会——但您可以启用所有编译器警告,这将向您显示您有此类行为的情况。


推荐阅读