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

Rob*_*rtR 4 c++ undefined-behavior

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

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

Nat*_*ica 7

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

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

struct foo
{
    std::string str;
};
Run Code Online (Sandbox Code Playgroud)

你会malloc像这样获得记忆

foo* f = malloc(sizeof(foo));
Run Code Online (Sandbox Code Playgroud)

那你就做不到

f->str = "some text";
Run Code Online (Sandbox Code Playgroud)

这样做的原因是因为malloc实际上并没有给您对象。它所做的只是为对象分配存储空间,这不足以认为您实际上拥有一个对象,因为std::string它具有非平凡的构造函数,这意味着foo的构造函数也非平凡的。为了使的生命周期*f开始,您需要调用foo的构造函数。为此,请使用new放置,它将在提供给它的内存中构造该对象。看起来像

foo* f = malloc(sizeof(foo));
new(f) foo;
Run Code Online (Sandbox Code Playgroud)

这很可能是Bjarne试图谈论的话题。