我在读 Do the parentheses after the type name make a difference with new

Michael Burr
讨论 uninitializedindeterminate 值。想知道两者的区别。

我的理解是,uninitialized 的意思是,编译器会分配内存而不是尝试初始化对象。 indeterminate -> 访问这个对象可能会导致未定义的行为。
如果我错了,请纠正我。

还想知道 default-initializationvalue-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-initializationvalue-initialization 不是您的主要问题的一部分,您应该在单独的问题中询问它们(假设您已经无法在此站点上找到答案)。

10-08 02:09