正在写入分配器 UB 分配的未初始化内存吗?之后阅读它呢?

Is writing to uninitialized memory allocated by allocator UB? And what about reading it afterwards?

struct Foo{ 
    int i;
    int j;
};

int main(){ 
    std::allocator<Foo> bar;
    Foo* foo = bar.allocate(1);
    foo->i = 0;
    return foo->i; // ignore the memory leak, it's irrelevant to the question
}

我很好奇上面的代码片段中是否存在未定义的行为?结论会不会根据Foo的类型不同(比如不是所有的成员都是POD类型,或者Foo有虚函数)?

使用未构造对象的原始内存是错误的。 我们必须构造对象才能使用返回的内存 allocate。未定义以其他方式使用未构造的内存Source: C++ Primer, Fifth Edition

因为你没有使用 construct 你的程序的行为在 C++20.

之前是未定义的

Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior.

所以您看到(也许看到)的输出是未定义行为的结果。正如我所说,不要依赖具有 UB 的程序的输出

因此,使程序正确的第一步是删除 UB。 然后并且只有那时你可以开始对程序的输出进行推理。


1有关未定义行为的技术上更准确的定义,请参阅 this 其中提到:没有对程序行为的限制.