[問題] 當new不到記憶體 該怎辦

看板C_and_CPP (C/C++)作者 (我愛阿蓉)時間16年前 (2010/03/16 02:49), 編輯推噓2(2015)
留言17則, 7人參與, 最新討論串1/1
請教板上經驗豐富的前輩 目前是幫朋友 想辦法解決他遇到的問題 希望可以給他意見 幫助他找出問題 該往哪去找出問題癥結 他的症狀是這樣 A專案跟 B專案,A專案編成 .lib 給 B 用 B編出exe => 正確 現在把 A 跟 B 合併成一個專案一起編出一個exe 只要new 或是 vector的push_back 就會發生以下問題 http://140.113.207.215/Image.jpg
<==VC 2008 + win7 64bit 換個平台試試看又會發生 http://140.113.207.215/Image3.jpg
<==VC 2008 + vista 32bit 其實之前寫code也常遇到: 同一個bug造成錯誤 每次跳出的錯誤都不太一樣... 如果用release跑 會出現 http://140.113.207.215/Image4.jpg
看起來是 存取到非法記憶體了 但是也很怪 只是new 並沒有開始access就跑出問題.... 目前他的程式並不是會吃大量記憶體的 100MB以下.. code都沒改只不過合併專案就發生這怪問題 以上問題可能有點籠統.. 不過想了解一下各位 遇到這種奇怪的問題 該往哪個方向 或是 如何找出root cause嗎? new壞了......邏輯沒變 怎麼會突然壞掉? 還是說程式跑到某種情況下 new一定會失敗 且無法recover? 請給予指教 謝謝大家!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.90.252

03/16 02:55, , 1F
可能真的把heap的link寫爛了 使得new在找可用記憶體時失敗
03/16 02:55, 1F

03/16 03:02, , 2F
怎麼才能寫壞呀@@這我能控制嗎 還是疏忽了什麼
03/16 03:02, 2F

03/16 03:33, , 3F
剛討論下發現 把 __declspec(align(16)) 這字眼去掉
03/16 03:33, 3F

03/16 03:33, , 4F
new可以過 但是 push_back還是壞 ..我不懂align跟出錯有絕對
03/16 03:33, 4F

03/16 03:34, , 5F
關係嗎? 還是只是巧合....雖然也不知道align目的是啥= =
03/16 03:34, 5F

03/16 03:37, , 6F
只知道效果.. 整個不知道問題癥結在哪....
03/16 03:37, 6F

03/16 09:08, , 7F
interesting :D 有沒有整個專案的包阿.. 我想試試看...
03/16 09:08, 7F

03/16 09:10, , 8F
我之前遇到過, vector在push_back的時候就炸heap, 當初
03/16 09:10, 8F

03/16 09:11, , 9F
還問co-work的同事是不是有設heap上限; 後來仔細再查才
03/16 09:11, 9F

03/16 09:11, , 10F
發現, 某個地方我new了char[], 然後還掉了, 可是後面的
03/16 09:11, 10F

03/16 09:12, , 11F
code又不小心對它讀寫, 結果有趣的是某段程式固定跑迴圈
03/16 09:12, 11F

03/16 09:12, , 12F
到第n圈的時候, vector的push_back就導致類似的error了.
03/16 09:12, 12F

03/16 09:13, , 13F
所以小弟我是覺得, 肯定是哪邊ptr用壞了, 寫了不該寫的.
03/16 09:13, 13F

03/16 09:16, , 14F
感謝樓上的經驗~ 最近也在解類似的東西
03/16 09:16, 14F

03/16 09:17, , 15F
~vector<T*> 失敗~ 不知前人怎用ptr的~ 洞挖超深的~XD
03/16 09:17, 15F

03/16 18:49, , 16F
先掛AppVerifier跑看看吧...
03/16 18:49, 16F

03/17 21:09, , 17F
建議用debug來trace一次吧... 然後再從呼叫堆疊查起
03/17 21:09, 17F
文章代碼(AID): #1Bde4yUT (C_and_CPP)
文章代碼(AID): #1Bde4yUT (C_and_CPP)