我有一些代码,如下所示:在try/catch之外声明但在内部初始化的指针会导致未定义的行为?
class ClassA
{
public:
ClassA(string p1, string p2);
void DoSomething();
};
int main()
{
ClassA *p = NULL;
try
{
// ...
// some external input that can throw
// ...
ClassA a{"some", "params"};
p = &a;
}
catch(...)
{
// print error
}
if (p != NULL) {
p->DoSomething(); // <- causes segfault
}
}
道歉,如果这是个坏/愚蠢的代码(我是新的C++),但为什么叫a->DoSomething()
导致段错误发生?显然,p
被声明在try/catch块的作用域之外,并且p != NULL
总是返回true,表明p
不为空,因此已在try/catch块内正确初始化。
有人可以帮我理解吗?
'a'在离开{}块后超出范围。所以现在'p'指向不再存在的东西 –
p仍然指向一个范围之后的地址,但是指针中的值未定义 – Raindrop7