【发布时间】:2020-05-31 06:31:42
【问题描述】:
struct foo {
int a;
int b;
};
std::array<char, sizeof(foo)> buffer;
foo a {1, 2};
foo* b {new (buffer.data()) foo};
std::memcpy(buffer.data(), &a, sizeof(foo));
a == *b; // the important part
我知道放置 new 使 b 的字段的值不确定,但是后续的 memcpy 是否通过指向缓冲区的指针传递给 new,然后将 b 转换为 @987654325 的副本@?还是有UB,因为我不是通过new返回的指针memcpy-ing?
cppreference 对我来说有点太迟钝了,在这种情况下,我无法确定它是否已定义。
编辑:假设 buffer 正确对齐以使新的展示位置有意义
【问题讨论】:
-
new (buffer.data()) foo很可能是 UB,因为buffer.data()很可能未与alignof(foo)对齐。使用std::aligned_storage.. -
std::memcpy(buffer.data(), &a, sizeof(foo));是 UB 有两个原因:buffer.data()指向其生命周期之外的对象,因此memcpy将访问生命周期之外的对象。而且既然已经是UB了,第二个原因就不用写了。
标签: c++ language-lawyer