Re: [問題]當數目太大會出現該記憶體不能為"written"?
※ 引述《peter0711 (peter0711 )》之銘言:
: 用vector和link list模擬matrix時,希望可以增加節點.
: 目前遇到的問題是為什麼 MAX 的數目最大只能到5000左右,不能再大了呢?
: 若 MAX = 8000,那執行過後,會出現"0x00401466" 指令參考的 "0x00000000"記億體.
程式碼我還沒仔細看, 不過看到這行我突然想起了幾天前就想打的一篇心得文
不要忽視對NULL位置的access denied error訊息
這東西成因很多, 如果是一個自己寫的程式的話多半是肇因於錯誤的程式設計觀念
或者錯誤的程式流程造成的不易debug錯誤
這個錯誤算是很珍貴的錯誤, 因為通常不易發現也不易debug
很多場合要不是跑出了這個錯誤, 還很難去得知程式內容有這些leak.
最常發生的原因就是錯誤的依賴return pointer value函數的性質
比方說new, 普通來講的確在new失敗的時候會傳回NULL
而一個程式設計上有時候會為方便, 而直接使用這性質作條件判斷
if(!(ptr = new string[n]))
ReportErrorAndTerminate("Fail of memory deploying!");
通常來講, 以前在C時代應對這種問題, 除了乖乖使用上面這種手法以外
就只能用(非常糟糕的)LongJmp/SetJmp類型函數(這功能嚴格講起來跟goto很像)
事實上在C++來講, 這樣寫也不能說錯,
只是你能保證你每一個pointer operator都會用個if包? 事實上不太可能
而只要一個沒包到, 就會造成NULL access denied.
正確的用法是try and catch, 利用std::bad_alloc這個exception ref. class
在catch中正確的捕捉出來. 當然傳統方法有其方便的地方
(我先自首, 我大多數的API程式設計都是用傳統方法 XD)
不過try and catch同樣也是一個很重要的學習重點就是.
這段碼我還沒看(事實上我大概也要明天可能才有空閒 =P)
也無從測試到底這個NULL access到底是從vector的問題還是使用者的問題
(不過STL不太可能會有這種問題? 號稱工業強度的東西說)
既然有了這個得來不易的錯誤訊息(?)
可能你可以利用try & catch檢查一下到底是哪理丟出的exception
直接把整個關鍵部分程式碼用try包起來 後面再用一個catch提示
我想這應該很容易就找出病因了 =P
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.140.109.129
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章