[問題] vector 大小無法自動加大

看板C_and_CPP作者 (SO嫩)時間15年前 (2010/08/15 11:10), 編輯推噓0(0046)
留言46則, 5人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 在複製一個vector的資料到另外一個vector時候發生錯誤 cout檢查發現,好像是vector無法自動加大 希望得到的正確結果: 可以複製 程式跑出來的錯誤結果: i capacity 0 1 1 2 2 4 3 4 4 8 5 8 6 8 7 8 8 16 9 16 10 16 . . 61 64 62 64 63 64 程式記憶體區段錯誤 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) g++,Linux 有問題的code: (請善用置底文標色功能) http://nopaste.info/2c213bbdc3.html 補充說明: 有換一段範圍ex i=100;i<size;i++ 依然會發生大小跑到64就不會加大的情況 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.91.177

08/15 11:19, , 1F
會不會是DataPt->NetListPt.GateVec[i]取值得時候錯誤呢
08/15 11:19, 1F

08/15 11:20, , 2F
用 gdb 跑跑看比較快。
08/15 11:20, 2F

08/15 11:37, , 3F
有試過不是取值而是直接new 再pushback 結果依然不行
08/15 11:37, 3F

08/15 11:38, , 4F
我覺得比較有可能是指標操作錯誤...
08/15 11:38, 4F

08/15 12:04, , 5F
程式在win上用Codeblock編譯是沒問題 跑起來也沒問題
08/15 12:04, 5F

08/15 12:05, , 6F
某些原因要轉到linux上才發現問題多多
08/15 12:05, 6F

08/15 12:39, , 7F
這種簡單程式換環境就會掛掉 99% 是程式沒寫好。
08/15 12:39, 7F

08/15 12:54, , 8F
試了vector<int>test 再去pushback capacity跑到128就當掉
08/15 12:54, 8F

08/15 12:58, , 9F

08/15 13:18, , 10F
有沒有完整的程式?
08/15 13:18, 10F

08/15 13:19, , 11F
光寫這種測試程式就出現 Parser::coarsing() 不太合理。
08/15 13:19, 11F

08/15 13:20, , 12F
這種死在 malloc()/new 的直覺是先前的程式破壞到 heap。
08/15 13:20, 12F

08/15 13:21, , 13F
你可以看看系統上有沒有裝 valgrind。一樣用 g++ -g 編譯
08/15 13:21, 13F

08/15 13:21, , 14F
,然後用 valgrind 執行你的程式檢查看看。
08/15 13:21, 14F

08/15 13:21, , 15F
爆在 heap 上的這工具還抓得到,stack 就不行了。
08/15 13:21, 15F

08/15 13:29, , 16F
完整的有點多 main:http://nopaste.info/94b3341009.html
08/15 13:29, 16F

08/15 13:29, , 17F
08/15 13:29, 17F

08/15 13:31, , 18F
08/15 13:31, 18F

08/15 13:31, , 19F
跟環境有沒關係?會不會資料量太大記憶體不夠?
08/15 13:31, 19F

08/15 13:31, , 20F
先謝謝t大了 第一次碰到這問題
08/15 13:31, 20F

08/15 13:36, , 21F
RAM應該不是問題 離max_size()還差很多
08/15 13:36, 21F

08/15 13:41, , 22F
感覺是t大說的 前面的code有問題 但是我第一次遇到
08/15 13:41, 22F

08/15 13:41, , 23F
不知道從哪裡下手 debug
08/15 13:41, 23F

08/15 14:37, , 24F
parser.cpp 好像沒貼完。
08/15 14:37, 24F

08/15 14:53, , 25F
不好意思沒有check http://tinyurl.com/3xu8o5k
08/15 14:53, 25F

08/15 15:03, , 26F
執行這個需要送什麼參數嗎?
08/15 15:03, 26F

08/15 15:03, , 27F
看起來是要 3 個 input file?
08/15 15:03, 27F

08/15 15:21, , 28F
把輸入資料檔也傳上來我才有辦法跑。
08/15 15:21, 28F

08/15 15:45, , 29F
08/15 15:45, 29F

08/15 16:27, , 30F
能不能解釋一下你 Parser.cpp:1568 為什麼要寫這一行嗎?
08/15 16:27, 30F

08/15 16:28, , 31F
1568 NetMap.~map();
08/15 16:28, 31F

08/15 16:31, , 32F
手動呼叫 stack object 的 destructor,你還真敢...
08/15 16:31, 32F

08/15 16:37, , 33F
另外建議你寫這種接命令列參數的程式,要先檢查 argc,再
08/15 16:37, 33F

08/15 16:37, , 34F
存取 argv。還有多留意每個 function 的傳回值。
08/15 16:37, 34F

08/15 16:38, , 35F
像是 Parser.h 的 116 行:
08/15 16:38, 35F

08/15 16:39, , 36F
... = strtok(strpbrk(netlistfile,"\\/")+1,".");
08/15 16:39, 36F

08/15 16:39, , 37F
strpbrk() 的傳回值看都不看就 + 1 丟給 strtok()。
08/15 16:39, 37F

08/15 16:40, , 38F
這些習慣都很危險。程式的縮排就姑且不挑了...
08/15 16:40, 38F

08/15 23:11, , 39F
謝謝 我會先改改看
08/15 23:11, 39F

08/15 23:25, , 40F
我用 valgrind 去 run 出來最先抓到的就是手動 call dtor
08/15 23:25, 40F

08/15 23:26, , 41F
的 function 末尾有 invalid access。
08/15 23:26, 41F

08/15 23:27, , 42F
後面遇到的就是 strpbrk 傳回 NULL,可能我送參數的方法
08/15 23:27, 42F

08/15 23:27, , 43F
跟你預期的有差:
08/15 23:27, 43F

08/15 23:27, , 44F
./test bench_3.v cell_info_bench6 process_3.info
08/15 23:27, 44F

08/15 23:27, , 45F
但是我是看壓縮檔裡的 txt 照著送的。
08/15 23:27, 45F

08/15 23:28, , 46F
後面我就沒繼續玩下去。
08/15 23:28, 46F
文章代碼(AID): #1CPrgCWc (C_and_CPP)