[問題] 使用vector的push_back出現glibc錯誤訊息

看板C_and_CPP (C/C++)作者 (香蕉是什麼?)時間16年前 (2009/12/20 17:53), 編輯推噓0(0023)
留言23則, 4人參與, 最新討論串1/3 (看更多)
我自訂了一class 叫做TypeA 示意如下 class TypeA { public: TypeA(){}; ~TypeA(){}; TypeA* pre; vector<int> cells; }; void functionA(...) { if(c->pre!=&REF) //我有宣告global的TypeA REF; functionB(c->pre,c); //之後第一次建立TypeA的物件時, pre=&REF //第一次過,pre=&(前一次的物件) } void functionB(TypeA* a1,TypeA* a2) { cout << a1->cells.size()<<endl; //印出a1的cells個數 cout << a2->cells.size()<<endl; //印出a2的cells個數 int i = 0; for(i=0;i<a1->cells.size();i++) //印出a1的cells內容 { cout << a1->cells[i]<<endl; } for(i=0;i<a2->cells.size();i++) //印出a2的cells內容 { cout << a2->cells[i]<<endl; } //以上的數值印出來都是正確的 for(i=0;i<a2->cells.size();i++) { a1->cells.push_back(a2->cells[i]); //執行到這行時出現了錯誤訊息[註1] } } [註1] *** glibc detected *** ./main.o: double free or corruption(fasttop): 0x00.... 去google了很久glibc常見於已經不在的空間如果又被delete 就會被"double free"[重複釋放] 有另一說是glibc的版本問題.... 另外有看到說vector的push_back是先破壞再建立的作法 所以其實也是會有釋放空間的動作 最讓我疑惑的是 如果cells的數值與空間大小都印的出來 那這個空間到底還存不存在呢? 還是他只是殘留著 只是剛好被印到而已? 不曉得這樣的表達方式夠不夠清楚 如果有說不清楚的地方 請告訴我 謝謝QQ 被這個問題困擾好幾天了....嗚.... 開發平台: (例: g++, Linux) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.187.104 ※ 編輯: gppo 來自: 140.116.187.104 (12/20 17:53)

12/20 18:16, , 1F
似乎需要多一點的資訊,比如那裡用到delete
12/20 18:16, 1F

12/20 18:16, , 2F
目前我run這個程式是對的
12/20 18:16, 2F

12/20 18:19, , 3F
目前沒有用到delete的指令 也沒有clear或erase
12/20 18:19, 3F

12/20 18:26, , 4F
我想先問看看 "空間不存在時讀取ok但修改不可以" 這樣的可能?
12/20 18:26, 4F

12/20 18:35, , 5F
也許在for迴圈裡試著輸出a2->cells[i]
12/20 18:35, 5F

12/20 18:59, , 6F
感覺是間接誘發的,你的 TypeA class 一看就覺得非常危險
12/20 18:59, 6F

12/20 18:59, , 7F
,如果你 TypeA 的建構子會 new 東西給 pre,解構子會
12/20 18:59, 7F

12/20 19:00, , 8F
delete pre,那會在複製 TypeA 物件時出事,但不會馬上炸
12/20 19:00, 8F

12/20 19:00, , 9F
,總之先看你 TypeA 的實作碼寫了什麼再說吧。
12/20 19:00, 9F

12/20 19:31, , 10F
回B大 在push_back以前的那兩個for迴圈 已經有把成正確印出了
12/20 19:31, 10F

12/20 19:32, , 11F
回T大 我的TypeA就真的只有TypeA(){}; 與~TypeA(){};而已
12/20 19:32, 11F

12/20 19:34, , 12F
不曉得你說的是不是指TypeA(){...new something...}; ??
12/20 19:34, 12F

12/20 19:35, , 13F
先感謝兩位...有人可以討論的感覺真好QQ 現在充滿無力感...
12/20 19:35, 13F

12/20 20:46, , 14F
看看工作站上有沒有裝 valgrind,有的話用 g++ -g 編譯一
12/20 20:46, 14F

12/20 20:46, , 15F
次你的程式碼,然後用 valgrind 跑你的程式。
12/20 20:46, 15F

12/20 20:47, , 16F
直接 valgrind <原本執行程式的指令> 就可以。
12/20 20:47, 16F

12/20 20:47, , 17F
valgrind ./xxx arg1 arg2 接參數也是直接接。
12/20 20:47, 17F

12/20 21:00, , 18F
你的 c->pre 可能沒有產生實體或是實體不存在~
12/20 21:00, 18F

12/20 21:10, , 19F
也有可能是 c.cells.size() = 0 … =_=|||
12/20 21:10, 19F

12/20 21:11, , 20F
c與c->pre的size都不是0 也確實都是正確的大小
12/20 21:11, 20F

12/20 21:11, , 21F
工作站沒裝valgrind....QQ
12/20 21:11, 21F

12/20 22:11, , 22F
把完整的程式放到可以下載的地方吧,c 不是 0 不代表它是
12/20 22:11, 22F

12/20 22:12, , 23F
有效值,C/C++ 並不會自動填 0。
12/20 22:12, 23F
文章代碼(AID): #1BBVG7Vx (C_and_CPP)
文章代碼(AID): #1BBVG7Vx (C_and_CPP)