【发布时间】:2019-01-17 13:36:08
【问题描述】:
在实现我自己的unique_ptr(只是为了好玩)时,我发现它无法从libstdcxx 传递这个test file:
struct A;
struct B
{
std::unique_ptr<A> a;
};
struct A
{
B* b;
~A() { VERIFY(b->a != nullptr); }
};
void test01()
{
B b;
b.a.reset(new A);
b.a->b = &b;
}
gcc passes这个测试文件很开心(当然这个文件来自libstdcxx),而clang fails则是VERIFY部分。
问题:
- 它是依赖于实现还是未定义的行为?
- 我猜这个后置条件 (
b->a != nullptr) 对 gcc 很重要,否则它不会有它的测试文件,但我不知道它背后是什么。跟优化有关系吗?我知道很多 UB 都是为了更好的优化。
【问题讨论】:
-
很高兴看到您的
unique_ptr实现以供参考(至少是析构函数)。 -
@user673679 我认为 OP 所说的行为来自标准
unique_ptr(请参阅 Wandbox 链接)。 -
我似乎无法在任何地方重现这种行为。它通过coliru。
-
是的,问题是关于 std::unique_ptr,不是我自己的
-
@MárioFeroldi
clang在 coliru 上使用来自 GCC 的 libstdc++。添加-stdlib=libc++,你会得到一个断言失败。
标签: c++ unique-ptr nullptr