默认构造函数(由编译器创建)会初始化内置类型吗?
发布于 2010-03-10 23:29:58
我不太确定你的意思,但是:
struct A { int x; };
int a; // a is initialized to 0
A b; // b.x is initialized to 0
int main() {
int c; // c is not initialized
int d = int(); // d is initialized to 0
A e; // e.x is not initialized
A f = A(); // f.x is initialized to 0
}
在我说“未初始化”的每一种情况下,你可能会发现你的编译器给了它一个一致的值,但标准并不要求它。
很多人挥舞着手,包括我在内,关于内置类型“实际上”是如何拥有默认构造函数的。实际上,缺省初始化和值初始化是标准中定义的术语,我个人每次都要查阅这些术语。只有在标准中定义的类才具有隐式的默认构造函数。
发布于 2010-03-10 21:10:03
根据标准,除非您在初始化器列表中显式初始化,否则它不会
发布于 2010-03-10 21:37:47
正如前面的发言者所说的那样-不,它们没有初始化。
这实际上是一个非常奇怪的错误的来源,因为现代操作系统倾向于用零填充新分配的内存区域。如果你希望如此,它可能会在第一次工作。然而,随着您的应用程序继续运行,delete
-ing和new
-ing对象,您迟早会遇到这样一种情况:您期望的是零,但是来自较早的对象的非零的剩余物存在。
那么,为什么不是所有的new
-ed数据都是新分配的?是的,但并不总是来自操作系统。操作系统倾向于使用更大的内存块(例如,一次4MB ),因此所有微小的一个字这里三个字节的分配和释放都是在uyserspace中处理的,因此不会被清零。
PS。我写的是“倾向于”,也就是说你甚至不能指望第一次成功……
https://stackoverflow.com/questions/2417065
复制相似问题