c++ - 默认情况下,在结构/类中声明的指针是否初始化为 nullptr?
问题描述
我在 Stack Overflow 上读到全局/静态变量已初始化为其默认值 ( 0
)。
我还在其他地方读到(不确定),类变量(非静态)也被初始化为0
. 这是真的?
具体来说,我想知道我的指针是否默认初始化为nullptr
.
我尝试编译g++
并且clang
两者似乎都将它们初始化为nullptr
.
#include <iostream>
struct Foo {
int *ptr;
};
int main() {
Foo f;
std::cout << f.ptr;
}
打印:
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;
}
使用 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]
...有什么办法可以告诉我的编译器不要这样做(使用一些编译器标志)?
可能不会——但您可以启用所有编译器警告,这将向您显示您有此类行为的情况。
推荐阅读
- ios - 使用凝固汽油弹的 commit:_config 时出现问题,找不到配置文件
- count - PowerBI 对会议数量进行分类
- android - 如何使用 AssetFileDescriptor 的偏移量、长度和文件路径从 NDK 读取文件?
- python - 有没有办法列出用于 Python 中特定项目的所有依赖项
- javascript - React - Mobx - Fetch - DRY 最佳实践
- c# - 如何从 .netcore 中的 wsdl 中删除方法名称
- firebase - 将 Firebase 云功能限制为 IP 地址
- python - ValueError:使用序列设置数组元素。在神经网络中
- python - Bokeh vbar hover 显示两个弹出窗口而不是一个
- c - C- 使用 fgets 或 sscanf 读取多行文件?