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

标签 c++ undefined-behavior

在 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/

相关文章:

c++ - 将类字段传递给成员函数

c++ - asio::streambuf 到 std::istream 丢弃新行

coffeescript - for循环中的索引变量(_i)?

c++ - 初始化表达式可以使用变量本身吗?

C++ 继承简单错误

java - Sudo Java 调用 C 应用程序和权限

c - 为什么这些构造使用增量前和增量后未定义的行为?

c - 通过 `extern` 变量访问 .text 段是否会导致未定义的行为?

c++ - 是否修改 const 对象的内部字节未定义行为,以防它包含由放置 new 构造的另一个对象?

c++ - 无法编译 boost::logger