写入未初始化的变量:未定义的行为?

在Bjarne Stroustrup的“ A C ++之旅”(第二版)的第18页上,他指出“对于几乎所有类型,读取或写入未初始化变量的效果都是不确定的。”

我了解为什么读取未初始化的变量是未定义的行为,但是为什么写入未初始化的变量却未定义的行为?我肯定会丢失一些东西,因为否则执行int x;之类的操作是完全没用的,因为在不触发未定义行为(假设)的情况下,您无法读取或写入x(即无法使用x进行任何操作) int是适用的“几乎所有类型”之一。

hash712 回答:写入未初始化的变量:未定义的行为?

写一个未初始化的变量就可以了。唯一带有未初始化变量的未定义行为是,您尝试在未写入任何变量之前读取它们。然后,您将具有不确定的行为,因为它具有的值是不确定的。

现在,未定义的行为正在写入其寿命尚未开始的对象。例如,如果您有一个类似

的结构
struct foo
{
    std::string str;
};

,您可以像{p>那样使用malloc获取内存

foo* f = malloc(sizeof(foo));

那你做不到

f->str = "some text";

之所以这样做是因为malloc实际上没有给您对象。它所做的只是为对象分配存储空间,这还不足以认为您实际上有一个对象,因为std::string的构造函数很简单,也就是说foo的构造函数也很重要。为了使*f的生命周期开始,您需要调用foo的构造函数。为此,您使用placement new,它将在您提供给它的内存中构造该对象。看起来像

foo* f = malloc(sizeof(foo));
new(f) foo;

这很可能是Bjarne想要谈论的事情。

本文链接:https://www.f2er.com/3092902.html

大家都在问