Rob*_*rtR 4 c++ undefined-behavior
在Bjarne Stroustrup的“ A C ++之旅”(第二版)的第18页上,他指出“对于几乎所有类型,读取或写入未初始化变量的效果都是不确定的”。
我了解为什么从未初始化的变量读取是未定义的行为,但是为什么写入未初始化的变量却未定义的行为?我肯定会丢失一些东西,因为否则执行类似的操作int x;是完全无用的,因为您不能在未触发未定义行为的情况下读取或写入x(即不能对进行任何操作x)(假设int这是适用于“几乎所有类型”的一种)。
写入未初始化的变量就可以了。唯一带有未初始化变量的未定义行为是,您尝试在未写入任何变量之前读取它们。然后,您将具有未定义的行为,因为它具有的值是未定义的。
现在,未定义的行为正在写入其寿命尚未开始的对象。例如,如果您有一个类似的结构
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试图谈论的话题。