看板 C_and_CPP 關於我們 聯絡資訊
我在網路上查東西時 逛到一個人的blog 他這邊有一個 sample code #include <cstdio> #include <cstdlib> class a { public: void foo() { puts("Hello world!"); } }; int main () { a *p = new a(); p->foo(); p = NULL; p->foo(); return 0; } 這份code我在 vs2005上跑可以過 大概猜得出來 p 這個指標還沒 delete 所以跑得出來結果 但是 p 指標都設成 null了 請問 p->foo() 這樣還可以 呼叫得出結果喔? 有高手可以解釋一下嗎~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.189.230
hichcock:跨丟鬼 04/25 16:01
azureblaze:沒virtual沒用到this的話foo根本不管p是什麼 04/25 16:04
stupid0319:也許p=-1被編譯器當成無義意的語句,優化去掉了 04/25 16:04
stupid0319:組語來看p->foo();就是指向foo()而且,所以p是Null沒差 04/25 16:09
stupid0319:就算可以,寫這種意義不明的語法,只會被教授扣分而已 04/25 16:12
azureblaze:我覺得這個的意義在於你不小心用到NULL pointer的時候 04/25 16:15
azureblaze:access violation會發生在第一個動到member的地方 04/25 16:16
azureblaze:而不是你call null pointer的地方 04/25 16:16
fuha:所以是 complier 自動 optimized 囉? 04/25 17:30
shadow0326:我覺得這不算是optimized. 一個class的method不會因為 04/25 17:38
shadow0326:instance不同就用不同的記憶體來存method,不同instance 04/25 17:39
shadow0326:使用同一個程式碼, 只是stack和this指標不同而已 04/25 17:40
purpose:原PO這個在意這個甜頭的話,何不用全域函數就好 04/25 19:38
purpose: 麼 ;畢竟不用virtual不用封裝,何必用class 04/25 19:39
fuha:沒有特別意思 只是剛看到code很驚訝這樣不會記憶體錯誤 04/25 20:45
ccbruce:這是沒問題的, 因為成員函數的呼叫其實是普通函數偷塞this 04/25 22:07
james732:所以有些code會出現 void foo() { if(this == NULL) ...} 04/25 22:08
ccbruce:這個成員沒用到this指標,所以"剛好"不會有錯誤,但是我認為 04/25 22:08
ccbruce:這種不用到this的其它成員的成員根本就是垃圾 04/25 22:09
s3748679:^ 還有靜態的成員函數啊,這不需要this哦~ 04/25 22:45