我在读 Do the parentheses after the type name make a difference with new
有 Michael Burr
讨论 uninitialized
和 indeterminate
值。想知道两者的区别。
我的理解是,uninitialized
的意思是,编译器会分配内存而不是尝试初始化对象。 indeterminate
-> 访问这个对象可能会导致未定义的行为。
如果我错了,请纠正我。
还想知道 default-initialization
和 value-initialization
之间的区别。
最佳答案
我认为你的解释很接近,但并不完全正确。uninitialized
表示内存被保留,但没有填充有意义的数据。一个简单的例子:
int* ptr;
所有这些都是保留一块内存来包含指针,但由于还没有 int,该指针的值不会改变,并且包含一个指向无意义位置的随机垃圾地址。
另一个例子:
class MyClass
{
int a;
int b;
MyClass() :
a(b) //Oops
b(5)
{ }
}
int b
在用于 a
时尚未初始化,并且再次包含随机垃圾。indeterminate
状态是对象被初始化时的状态,但是(可能是因为不再打算使用它)您不知道其中的内容。它的行为是不可预测的,但不是无效的(当然,除非文档说它也是无效的)。例如:
std::string a("text");
std::string b(std::move(a));
string a
现在可能只是一个空字符串。访问它不会导致未定义的行为,它的行为与任何其他空字符串一样。除非你不确定它是空的。就你所知,它可能已经用对一些静态 const char 数组的引用替换了它的 char 数组,说
"this is an indeterminate object why are you accessing me leave me alone."
。或者一些复杂的一系列看似随机的字符,这是内部优化的结果。你不知道里面有什么,也不应该使用它。但是当你这样做时,它不会给你未定义的行为。在未定义的数据上只是无用的行为。default-initialization
和 value-initialization
不是您的主要问题的一部分,您应该在单独的问题中询问它们(假设您已经无法在此站点上找到答案)。