Re: [問題]當數目太大會出現該記憶體不能為"written"?

看板C_and_CPP (C/C++)作者 (殺人貓™)時間17年前 (2007/03/20 20:55), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ 引述《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
文章代碼(AID): #15_zd7kQ (C_and_CPP)
文章代碼(AID): #15_zd7kQ (C_and_CPP)