【发布时间】:2024-01-12 12:01:02
【问题描述】:
代码:
#include <cstdio>
#include <new>
struct Foo {
char ch;
~Foo() { ++ch; }
};
int main() {
static_assert(sizeof(Foo) == 1);
char buffer;
auto const* pc = new (&buffer) Foo{42};
// Change value using only the const pointer
std::printf("%d\n", +buffer);
pc->~Foo();
std::printf("%d\n", +buffer);
}
据我所知,我没有引起任何 UB,但 GCC 和 Clang 对结果存在分歧。我认为输出显然应该是“42 43”。 Clang 就是这种情况,但 GCC 认为输出是“42 0”。这怎么可能?谁将缓冲区归零?我错过了什么吗?
【问题讨论】:
-
你的代码是未定义的行为,所以编译器都没有错。
-
@BenVoigt 你能详细说明什么是未定义的吗?
-
你的期望是错误的。编译器发现 ++ch 的结果未被使用并忽略增量。您可以使用
volatile char ch;更改行为。 -
@S.M.那么它会打印 42 42?
-
@Eljay 我的问题是我经常将
char视为内存字节,而不是一个拥有自己生命周期的适当对象。
标签: c++ undefined-behavior object-lifetime placement-new