我想知道爲什麼下面的小程序不會導致NullPointerException。 任何想法? 輸出是2x Hello World !!!在我的MacBook上使用clang-500.2.79。空指針可訪問
#include <iostream>
using namespace std;
class Strange {
public:
Strange() {}
virtual ~Strange() {}
void sayHello() {
cout<<endl<<"Hello World!!!"<<endl;
}
};
int main(void) {
Strange* s = new Strange();
delete s; s = NULL;
s->sayHello();
(*s).sayHello();
return 0;
}
不完全正確......我期望對NULL解引用有一個分段錯誤。不過,我認爲編譯器優化只是忽略瞭解引用操作,因爲該函數不使用'this'參數,所以不會發生實際的解除引用。 – immortal
@immortal:只有當內存被訪問時,並且只有當指針指向一個不可訪問的內存頁面時,並且只有當硬件支持內存保護時。分段故障是一個硬件級別的故障,它只是由實際訪問內存的嘗試觸發的;它對解引用等軟件級概念一無所知。 –
我嘗試了幾個編譯器優化,現在也嘗試了最新的gcc(從-O0直到O3),輸出始終工作,我從來沒有得到任何seg故障或其他異常:( – Mats