我有一些代碼,如下所示:在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