gpt4 book ai didi

c++ - 写入未初始化的变量 : undefined behaviour?

转载 作者:行者123 更新时间:2023-12-03 13:05:21 28 4
gpt4 key购买 nike

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

我明白为什么读取未初始化的变量是未定义的行为,但为什么写入未初始化的变量是未定义的行为?当然我错过了一些东西,因为否则做类似 int x; 的事情完全没用,因为您无法读取或写入 x (即不能对 x 做任何事情)而不触发未定义的行为(假设 int 是适用于的“几乎所有类型”之一)。

最佳答案

写入未初始化的变量很好。使用未初始化的变量获得未定义行为的唯一时间是在向它们写入任何内容之前尝试读取它们时。然后你有未定义的行为,因为它的值是未定义的。

现在,未定义行为是写入生命周期尚未开始的对象。例如,如果你有一个像

struct foo
{
std::string str;
};

然后你用 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 想要谈论的。

关于c++ - 写入未初始化的变量 : undefined behaviour?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58883829/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com