【发布时间】:2020-05-13 07:06:07
【问题描述】:
以前知道未初始化的成员变量是用垃圾值初始化的。
但是,如果类中存在未初始化的指针变量,则所有未初始化的成员变量都初始化为零。
我认为指针变量只是指向堆内存中的一个实例。
为什么其他变量会改变?
我不知道这些初始化之间有什么区别。
下面是我一步一步尝试的代码。
#include <iostream>
using namespace std;
class Test {
private:
int val1;
int val2;
public:
void PrintValue() {
cout << "val1: " << val1 << endl;
cout << "val2: " << val1 << endl;
}
};
int main() {
Test a;
a.PrintValue();
}
那么,结果是
val1: -858993460
val2: -858993460
在这段代码中,我添加了 'int* ptr = new int',如下所示。
#include <iostream>
using namespace std;
class Test {
private:
int val1;
int val2;
int* ptr = new int;
public:
void PrintValue() {
cout << "val1: " << val1 << endl;
cout << "val2: " << val1 << endl;
}
};
int main() {
Test a;
a.PrintValue();
}
结果是这样的。
val1: 0
val2: 0
为什么会这样?
我正在使用 VS community 2019 并构建工具 v142。
【问题讨论】:
-
0怎么不是垃圾? btw uninitialized 就是 uninitialized,没有“用垃圾初始化”之类的东西 -
未初始化的成员变量没有用垃圾值初始化。它们根本没有初始化。这就是为什么它们被称为未初始化。它们将具有上次使用时恰好在该内存中的任何值。
-
@Eric - 当场。期望未初始化的变量最终以“垃圾值”(其中“垃圾”没有得到很好的定义,但通常被解释为“不为零”)的期望必须是 C 和 C++ 开发人员中最愚蠢的现象之一。这表明那里有太多糟糕的教材(是的,我见过很多)和太多糟糕的老师
-
必须接受这是偶然发生的,并假设它是 msvc 的实现细节,不应该被信任。可能的原因是这些位置的字节偶然表示为零(如果 msvc 保持原样离开内存)。
-
你是在 VS 中以 debug 还是 release 模式编译?
标签: c++ initialization