推 azureblaze:undefined behavior不代表他要壞掉給你看 12/27 15:58
→ azureblaze:你做這種事他可以假裝他好好的 12/27 15:59
→ azureblaze:os new給你的記憶體範圍可能比較大一點 12/27 16:00
→ azureblaze:或者他沒做存取檢查(VC好像只擋超過0xC000000的) 12/27 16:01
→ azureblaze:delete的時候os才會知道你想free一塊他沒給你的記憶體 12/27 16:02
→ azureblaze:然後這時候os不見得要做exception所以catch不到東西 12/27 16:02
→ QQ29:#15690 之前問的 以t大解釋似乎沒有辦法理解他怎delete時候 12/27 16:05
→ QQ29:知道有非法的存取過... 12/27 16:05
→ azureblaze:看錯了我沒仔細看你的code 12/27 16:11
→ azureblaze:以vc2010來說,你new東西的時候他會在後面偷塞一段東西 12/27 16:12
→ azureblaze:delete的時候再檢查這段東西是不是一樣 12/27 16:13
→ azureblaze:因為陣列超界是常見錯誤所以debug的時候他幫你檢查 12/27 16:14
→ QQ29:run release也是壞掉..他是怎麼判斷我亂改東西呢 12/27 16:16
→ azureblaze:總之這全部都是undefined behavior 12/27 16:16
→ azureblaze:你不能期望他幫你作什麼 12/27 16:17
→ azureblaze:我試了一下release *ptr==5566;這邊就掛了 12/27 16:22
→ azureblaze:然後debbuger下的release他似乎還是幫你作檢查 12/27 16:22
→ azureblaze:debbuger可以把new delete的函數偷偷換掉 12/27 16:23
→ QQ29:所以這種error無法handle 只能讓程式 當掉嗎? 12/27 17:07
→ QQ29:有沒有甚麼優雅的 handle方式 12/27 17:07
→ azureblaze:這一般算fatal error 12/27 17:11
→ azureblaze:偵測到一個錯誤不代表只有一個錯誤 12/27 17:11
→ azureblaze:他只能假設你沒救了把你關掉 12/27 17:11
→ azureblaze:這種error handle的方式叫做「不要讓他發生」 12/27 17:12
→ azureblaze:資料寫入前你就應該先檢查大小 自己丟exception 12/27 17:13
→ EdisonX:其實第一個問題也是某科技公司的面試題,為何某些debugger 12/27 17:53
→ EdisonX:可以抓取到 int x[100]; x[101]=20; 這種逾界問題. 12/27 17:54
→ EdisonX:然後問這問題有沒有辦法自己用簡單方式動手作之類的.. 12/27 17:56
→ QQ29:動手做?? 有解答嗎@@ 這種stack out of bound 好像不會盪? 12/27 18:36
→ QQ29:我VC只有在debug mode才會被檢查出來@@ 12/27 18:38
推 littleshan:這不是用vector::at()就好了嗎 它幫你做bound check 12/27 18:43
推 azureblaze:stack好像不靠compiler動手腳很難處理? 12/27 18:47
→ littleshan:話說回來,為什麼原po那麼執著於undefined behavior 12/27 18:53
→ littleshan:同樣的事情換個平台你又會遇到不一樣的行為 12/27 18:54
→ littleshan:就算你知道底層記憶體的實作細節 也應該把它當黑盒子 12/27 18:56
→ EdisonX:@littleshan ~ 簡單的說,那次面談有提到 dbg_malloc,但一 12/27 19:04
→ EdisonX:般 dbg_malloc 都是查 mem.leak,問有沒有辦法check bound. 12/27 19:05
→ EdisonX:然後 stack 我也覺得是無解,heap的話當時我給的sol很搞剛, 12/27 19:06
→ EdisonX:又不一定能work,回家想想大概也是從 compiler 動手腳 @@ 12/27 19:08
→ PkmX:當你要做黑黑的事情的時候就需要去了解它的behavior了 (誤 12/27 19:11