【发布时间】:2021-12-18 09:29:31
【问题描述】:
这是一个悬空指针
Foo* p;
{
Foo f;
p = &f;
}
// now p is dangling pointer
但是,为什么这不是一个悬空指针?
Foo* p;
{
Foo f;
...
*p = f;
}
// p still contains the data of f
是不是因为在第二种情况下,我们在做副本?这是否意味着我应该写
*p = std::move(f);
如果我不想要副本?
谢谢!
【问题讨论】:
-
这是 ub。指针 p 未初始化。
-
您正在取消引用一个未初始化的指针。这与你无关吗?尝试复制到 p 指向的地方,但 p 指向哪里?
-
你的第一个例子产生一个悬空指针,你的第二个例子可以有效地被视为已经是一个悬空指针。尽管它在技术上不符合“悬空”的定义,但它同样无法使用。
-
在第二个花瓶中,
p是一个未初始化的指针,因此访问它的值(更不用说通过*p取消引用它)会产生未定义的行为。要对*p执行任何操作而不调用未定义的行为,必须初始化或分配p,使其指向一个有效对象(例如p = &some_object_that_exists; *p = f;)