[問題]關於一個網路上看到的 code 有疑問

看板C_and_CPP作者 (mimi)時間12年前 (2012/04/25 15:54), 編輯推噓7(7013)
留言20則, 9人參與, 最新討論串1/1
我在網路上查東西時 逛到一個人的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

04/25 16:01, , 1F
跨丟鬼
04/25 16:01, 1F

04/25 16:04, , 2F
沒virtual沒用到this的話foo根本不管p是什麼
04/25 16:04, 2F

04/25 16:04, , 3F
也許p=-1被編譯器當成無義意的語句,優化去掉了
04/25 16:04, 3F

04/25 16:09, , 4F
組語來看p->foo();就是指向foo()而且,所以p是Null沒差
04/25 16:09, 4F

04/25 16:12, , 5F
就算可以,寫這種意義不明的語法,只會被教授扣分而已
04/25 16:12, 5F

04/25 16:15, , 6F
我覺得這個的意義在於你不小心用到NULL pointer的時候
04/25 16:15, 6F

04/25 16:16, , 7F
access violation會發生在第一個動到member的地方
04/25 16:16, 7F

04/25 16:16, , 8F
而不是你call null pointer的地方
04/25 16:16, 8F

04/25 17:30, , 9F
所以是 complier 自動 optimized 囉?
04/25 17:30, 9F

04/25 17:38, , 10F
我覺得這不算是optimized. 一個class的method不會因為
04/25 17:38, 10F

04/25 17:39, , 11F
instance不同就用不同的記憶體來存method,不同instance
04/25 17:39, 11F

04/25 17:40, , 12F
使用同一個程式碼, 只是stack和this指標不同而已
04/25 17:40, 12F

04/25 19:38, , 13F
原PO這個在意這個甜頭的話,何不用全域函數就好
04/25 19:38, 13F

04/25 19:39, , 14F
麼 ;畢竟不用virtual不用封裝,何必用class
04/25 19:39, 14F

04/25 20:45, , 15F
沒有特別意思 只是剛看到code很驚訝這樣不會記憶體錯誤
04/25 20:45, 15F

04/25 22:07, , 16F
這是沒問題的, 因為成員函數的呼叫其實是普通函數偷塞this
04/25 22:07, 16F

04/25 22:08, , 17F
所以有些code會出現 void foo() { if(this == NULL) ...}
04/25 22:08, 17F

04/25 22:08, , 18F
這個成員沒用到this指標,所以"剛好"不會有錯誤,但是我認為
04/25 22:08, 18F

04/25 22:09, , 19F
這種不用到this的其它成員的成員根本就是垃圾
04/25 22:09, 19F

04/25 22:45, , 20F
^ 還有靜態的成員函數啊,這不需要this哦~
04/25 22:45, 20F
文章代碼(AID): #1FbwsyLk (C_and_CPP)