在这里,迈克尔·伯尔讨论了uninitialized和indeterminate值。想知道两者之间的区别。
我的理解是,uninitialized意味着编译器将分配内存,而不是尝试初始化对象。访问此对象的indeterminate->可能会导致未定义的行为。如果我错了,请纠正我。
还想知道default-initialization和value-initialization之间的区别。
发布于 2014-05-23 13:33:38
我认为你的解释很接近,但不完全正确。
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现在可能只是一个空字符串。访问它不会导致未定义的行为,它将像任何其他空字符串一样运行。只是你不确定它是不是空的。
据您所知,它可能已经将char数组替换为引用一些静态的const数组,称为"this is an indeterminate object why are you accessing me leave me alone."。或者一系列看似随机的复杂字符,这是内部优化的结果。你不知道里面有什么,也不应该用它。但是当你这样做的时候,它不会给你不确定的行为。只是无用的行为,对未定义的数据。
default-initialization和value-initialization不是你主要问题的一部分,你应该在一个单独的问题中问那些问题(假设你已经在这个网站上找不到答案了)。
发布于 2014-05-23 14:00:19
什么是不定值?的WhozCraig给出了一个很好的答案。在评论中有一个关于阅读价值的讨论。问题是关于C99的;C++11标准本身并没有定义“不定值”的含义(至少不是文档草案)。我将对相关的部分进行总结。
这个问题本身在C99中有不定值的定义:
3.17.2 1不定值 未指定的值或陷阱表示
链接的答案链接到另一个关于陷阱表示的好问题,以获得更多信息。
Steve评论了在C或C++中读取不确定值或未初始化值的效果。
它的实现定义了int是否有任何陷阱表示。如果它没有(而且我从来没有实际使用过具有int的陷阱值的实现),那么读取不确定值就不是未定义的行为:您知道它不是陷阱值,所以它是int类型的有效值,只是没有指定是哪一个。相比之下,在C++中,读取任何未初始化的值都是显式UB。在C和C++中,读取陷阱表示都是UB
我还从新C标准(coding-guidelines.com)上找到了这些评论,它们对C90、C99和C++ ('98和'03)标准进行了评论。
75:
C++ 对象可能具有不确定的值。但是,该标准并没有明确说明该值的属性。
579:
C90 C90标准指定读取未初始化的对象是未定义的行为。但是,它没有为任何其他表示指定未定义的行为。 C++ C++标准没有显式地指定任何此类行为。
https://stackoverflow.com/questions/23829979
复制相似问题