正在写入分配器 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 其中提到:没有对程序行为的限制.
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 其中提到:没有对程序行为的限制.