[問題] vector因為capacity改變而產生的segmen …

看板C_and_CPP (C/C++)作者 (Zoxge)時間14年前 (2011/08/16 21:12), 編輯推噓6(6036)
留言42則, 7人參與, 最新討論串1/5 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 問題(Question): 我的vector是 vector<ABC> vVec; 其中ABC是個class,其中下面只列出要描述問題的部份 class ABC { private: vector<ABC* > _vOS; vector<ABC* > _vIS; public: ABC(DEF*); //DEF是另一個class void setOS(ABC* pABC) { _vOS.push_back(pABC); } int ossize() { return _vOS.size(); } ABC* os(int iIndex) { return _vOS.at(iIndex); } void setIS(ABC* pABC) { _vIS.push_back(pABC); } int issize() { return _vIS.size(); } ABC* is(int iIndex) { return _vIS.at(iIndex); } } 一開始,我的vVec.size()是126,此時vVec.capacity()是128 但是後來有需要而必須增加vVec的元素,當size到達128後,capacity會自動變256 我查primer p.330所提到的: 當capacity改變時,會把元素從元位置複製到新位置、添加新元素、釋放原記憶體 但是size≧128後 我的object去call is這個member function時,竟然會出現segmentation fault 但是call os卻仍然能正常找到我要的資料 我也實際印出vVec的記憶體位址來看,capacity改變後,記憶體位址的確是跟著改變了 但是照primer書上所說的,應該會把資料複製過去才對 現在卻發生某些資料還在,某些資料卻不見了(segmentation fault)的情形 我在setOSsetIS時,都是用類似的方法去存資料的 全部的setOS都做完後,才做setIS setOS部份: vVec.at(i).setOS( &(vVec.at(j)) ); setIS部份: ABC* s = &(vVec.at(i)); for(int k=0; k<s->ossize(); k++) { s->os(k)->setIS(s); } 同樣的情形也發生在vVec.size()本來介於128~255,後來增添元素使size≧256 256~511 512 補充說明(Supplement): 這個問題怎麼看都不知道如何解決 所以我後來只好放大決 = = 因為我事先知道vVec最多會需要放多少個元素 所以事先 vVec.reserve(1024); ,讓vVec不必再改變capacity 這樣的話就不會再有資料不見的情形 = = 但是..問題的根本還是不知道如何解決 @@ 所以來這裡請教大家 麻煩高手解惑 感恩感恩啊~~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.29.203

08/16 21:15, , 1F
有multi-thread嗎?
08/16 21:15, 1F
※ 編輯: Zoxge 來自: 123.195.29.203 (08/16 21:16)

08/16 21:16, , 2F
回a大,沒有
08/16 21:16, 2F

08/16 21:34, , 3F
有辦法把程式碼簡化到能貼上來讓大家跑嗎?真的挺怪的...
08/16 21:34, 3F

08/16 21:35, , 4F
不過把 vector 改成 list 不知道會不會有同樣狀況
08/16 21:35, 4F

08/16 21:39, , 5F
不知道配新的空間是怎麼做的? 有檢查是否得到空間嗎?
08/16 21:39, 5F

08/16 21:45, , 6F
...這是要幾個vector...
08/16 21:45, 6F

08/16 21:46, , 7F
...ABC到底是裝什麼...
08/16 21:46, 7F

08/16 21:50, , 8F
我蠻疑惑要怎麼去配置一個ABC...
08/16 21:50, 8F

08/16 21:53, , 9F
原來有DEF 我錯了orz
08/16 21:53, 9F

08/16 21:57, , 10F
http://pastie.org/2380542 我這樣的程式沒問題
08/16 21:57, 10F

08/16 21:57, , 11F
在想說會不會是你的 copy constructor 沒寫好
08/16 21:57, 11F

08/16 22:00, , 12F
唔,好像也跟 copy constructor 沒啥關係...
08/16 22:00, 12F

08/16 22:04, , 13F
這個程式頗大的 囧 我是節錄有問題的部份
08/16 22:04, 13F

08/16 22:07, , 14F
可能ABC 有pointer member 產生 shallow copy
08/16 22:07, 14F

08/16 22:13, , 15F
shallow copy是指??
08/16 22:13, 15F

08/16 22:13, , 16F
問一下原PO: 當capacity改變時的那些動作, 怎麼知道
08/16 22:13, 16F

08/16 22:14, , 17F
一定會成功呢? (有沒有類似java exception的機制?)
08/16 22:14, 17F

08/16 22:14, , 18F
來回報?
08/16 22:14, 18F

08/16 22:17, , 19F
shallow copy copy時就是只復制到ptr address
08/16 22:17, 19F

08/16 22:18, , 20F
沒有alloc 一塊新的空間
08/16 22:18, 20F

08/16 22:18, , 21F
他的vector只有存pointer,應該很單純的...
08/16 22:18, 21F

08/16 22:18, , 22F
有alloc 一塊新的空間就叫 deep copy
08/16 22:18, 22F

08/16 22:19, , 23F
總覺得問題是出在別的地方
08/16 22:19, 23F

08/16 22:24, , 24F
e大:我不知道是否一定會成功 但這不是C++本身的機制嗎?
08/16 22:24, 24F

08/16 22:24, , 25F
@ericinttu: vector配置失敗會丟出std::bad_alloc
08/16 22:24, 25F

08/16 22:25, , 26F
我的執行結果是這樣 http://pastie.org/2380647
08/16 22:25, 26F

08/16 22:25, , 27F
兩位j大,請問要如何知道是否有allocate新空間呢?
08/16 22:25, 27F

08/16 22:26, , 28F
我建議你先看看 ABC 跟 DEF 有哪些地方不一樣
08/16 22:26, 28F

08/16 22:26, , 29F
我有個疑問,我都是用vVec.at(i)而不是vVec[i]
08/16 22:26, 29F

08/16 22:27, , 30F
如果有segmenation fault的話,不是應該會提出警告嗎?
08/16 22:27, 30F

08/16 22:28, , 31F
我的程式是直接回報segmentation fault,而沒有bac_alloc
08/16 22:28, 31F

08/16 22:28, , 32F
我的猜測:你的程式是錯在別的地方,跟vector無關
08/16 22:28, 32F

08/16 22:28, , 33F
不過也只是猜的...XD
08/16 22:28, 33F

08/16 22:29, , 34F
at(i) 失敗是丟 out_of_range
08/16 22:29, 34F

08/16 22:34, , 35F
ABC和DEF要"一樣"才能以 "ABC(DEF*);" 去配置ABC嗎??
08/16 22:34, 35F

08/16 22:35, , 36F
...對不起我錯了,跟兩者的差別沒有關係 orz
08/16 22:35, 36F

08/16 22:36, , 37F
我也推是 shallow copy 耶..
08/16 22:36, 37F

08/16 22:39, , 38F
我的也沒有回報 out_of_range
08/16 22:39, 38F

08/16 22:39, , 39F
請問那要怎麼找出shallow copy的原因呢?
08/16 22:39, 39F

08/16 22:40, , 40F
我真的沒遇過這種事情 QQ
08/16 22:40, 40F
※ 編輯: Zoxge 來自: 123.195.29.203 (08/16 23:19)

08/17 06:37, , 41F
我也覺得應該是別的地方掛了…像是不該被free的卻free掉了?
08/17 06:37, 41F

08/17 06:38, , 42F
那個vector只管ptr,實際的alloc和free應該不是它管的。
08/17 06:38, 42F
文章代碼(AID): #1EIcp1cM (C_and_CPP)
文章代碼(AID): #1EIcp1cM (C_and_CPP)