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