首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未初始化与不确定的区别

未初始化与不确定的区别
EN

Stack Overflow用户
提问于 2014-05-23 13:01:12
回答 2查看 472关注 0票数 4

我在读类型名称后的括号是否与新的不同?

在这里,迈克尔·伯尔讨论了uninitializedindeterminate值。想知道两者之间的区别。

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

还想知道default-initializationvalue-initialization之间的区别。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-23 13:33:38

我认为你的解释很接近,但不完全正确。

uninitialized意味着内存是保留的,但没有填充有意义的数据。一个简单的例子:

代码语言:javascript
复制
int* ptr;

所做的就是保留一段内存来包含指针,但是由于还没有int,所以指针的值不会被更改,并且包含一个随机的垃圾地址到一个没有意义的位置。

另一个例子是:

代码语言:javascript
复制
class MyClass
{
    int a;
    int b;

    MyClass() :
        a(b) //Oops
        b(5)
    { }
}

int b在用于a时还没有初始化,而且还包含随机垃圾。

indeterminate状态是当对象被初始化时,但是(可能是因为它不再被使用),您不知道它里面有什么。

它的行为是不可预测的,但并不是无效的(当然,除非文档说它也是无效的)。例如:

代码语言:javascript
复制
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-initializationvalue-initialization不是你主要问题的一部分,你应该在一个单独的问题中问那些问题(假设你已经在这个网站上找不到答案了)。

票数 3
EN

Stack Overflow用户

发布于 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++标准没有显式地指定任何此类行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23829979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档