在下面的代码中,一个SomeClass
对象的作用域位于一个块内,但对它的引用存储在p
外部块中。稍后使用p
,调用SomeMethod()
of 。SomeClass
SomeClass TestMethod(SomeClass c) {
SomeClass * p;
{
SomeClass t;
p = &t;
}
p->SomeMethod();
return *p;
}
是否会p->SomeMethod()
因空指针取消引用而导致故障?
我尝试使用int
代替SomeClass
,但没有得到空指针取消引用。但我想根据 C++ 标准了解行为。
不,这不一定会导致空指针取消引用。
p
在块内被分配了一些非空值。仅仅因为它指向的东西已经结束了它的生命周期并不意味着存储在中的值(指针值)p
会nullptr
神奇地变成。但是
SomeMethod
,如果是非静态方法,这仍然是未定义的行为,因为(假设SomeClass
是类类型 - 强烈暗示)的生命周期t
在块结束时结束。行为未定义。
在被调用的时候
p->SomeMethod()
,指向的对象p
已经结束了它的生命周期,并且p
一直处于悬空状态。p
不会nullptr
自动设置为,p
因此由于任何原因的取消引用都会访问无效对象。