看板 C_and_CPP 關於我們 聯絡資訊
我自訂了一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)
bleed1979:似乎需要多一點的資訊,比如那裡用到delete 12/20 18:16
bleed1979:目前我run這個程式是對的 12/20 18:16
gppo:目前沒有用到delete的指令 也沒有clear或erase 12/20 18:19
gppo:我想先問看看 "空間不存在時讀取ok但修改不可以" 這樣的可能? 12/20 18:26
bleed1979:也許在for迴圈裡試著輸出a2->cells[i] 12/20 18:35
tinlans:感覺是間接誘發的,你的 TypeA class 一看就覺得非常危險 12/20 18:59
tinlans:,如果你 TypeA 的建構子會 new 東西給 pre,解構子會 12/20 18:59
tinlans:delete pre,那會在複製 TypeA 物件時出事,但不會馬上炸 12/20 19:00
tinlans:,總之先看你 TypeA 的實作碼寫了什麼再說吧。 12/20 19:00
gppo:回B大 在push_back以前的那兩個for迴圈 已經有把成正確印出了 12/20 19:31
gppo:回T大 我的TypeA就真的只有TypeA(){}; 與~TypeA(){};而已 12/20 19:32
gppo:不曉得你說的是不是指TypeA(){...new something...}; ?? 12/20 19:34
gppo:先感謝兩位...有人可以討論的感覺真好QQ 現在充滿無力感... 12/20 19:35
tinlans:看看工作站上有沒有裝 valgrind,有的話用 g++ -g 編譯一 12/20 20:46
tinlans:次你的程式碼,然後用 valgrind 跑你的程式。 12/20 20:46
tinlans:直接 valgrind <原本執行程式的指令> 就可以。 12/20 20:47
tinlans:valgrind ./xxx arg1 arg2 接參數也是直接接。 12/20 20:47
johnhmj:你的 c->pre 可能沒有產生實體或是實體不存在~ 12/20 21:00
johnhmj:也有可能是 c.cells.size() = 0 … =_=||| 12/20 21:10
gppo:c與c->pre的size都不是0 也確實都是正確的大小 12/20 21:11
gppo:工作站沒裝valgrind....QQ 12/20 21:11
tinlans:把完整的程式放到可以下載的地方吧,c 不是 0 不代表它是 12/20 22:11
tinlans:有效值,C/C++ 並不會自動填 0。 12/20 22:12