看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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
aecho:有multi-thread嗎? 08/16 21:15
※ 編輯: Zoxge 來自: 123.195.29.203 (08/16 21:16)
Zoxge:回a大,沒有 08/16 21:16
james732:有辦法把程式碼簡化到能貼上來讓大家跑嗎?真的挺怪的... 08/16 21:34
james732:不過把 vector 改成 list 不知道會不會有同樣狀況 08/16 21:35
ericinttu:不知道配新的空間是怎麼做的? 有檢查是否得到空間嗎? 08/16 21:39
firejox:...這是要幾個vector... 08/16 21:45
firejox:...ABC到底是裝什麼... 08/16 21:46
firejox:我蠻疑惑要怎麼去配置一個ABC... 08/16 21:50
firejox:原來有DEF 我錯了orz 08/16 21:53
james732:http://pastie.org/2380542 我這樣的程式沒問題 08/16 21:57
james732:在想說會不會是你的 copy constructor 沒寫好 08/16 21:57
james732:唔,好像也跟 copy constructor 沒啥關係... 08/16 22:00
Zoxge:這個程式頗大的 囧 我是節錄有問題的部份 08/16 22:04
johnlinvc:可能ABC 有pointer member 產生 shallow copy 08/16 22:07
Zoxge:shallow copy是指?? 08/16 22:13
ericinttu:問一下原PO: 當capacity改變時的那些動作, 怎麼知道 08/16 22:13
ericinttu: 一定會成功呢? (有沒有類似java exception的機制?) 08/16 22:14
ericinttu: 來回報? 08/16 22:14
johnlinvc:shallow copy copy時就是只復制到ptr address 08/16 22:17
johnlinvc:沒有alloc 一塊新的空間 08/16 22:18
james732:他的vector只有存pointer,應該很單純的... 08/16 22:18
johnlinvc:有alloc 一塊新的空間就叫 deep copy 08/16 22:18
james732:總覺得問題是出在別的地方 08/16 22:19
Zoxge:e大:我不知道是否一定會成功 但這不是C++本身的機制嗎? 08/16 22:24
james732:@ericinttu: vector配置失敗會丟出std::bad_alloc 08/16 22:24
james732: 我的執行結果是這樣 http://pastie.org/2380647 08/16 22:25
Zoxge:兩位j大,請問要如何知道是否有allocate新空間呢? 08/16 22:25
james732:我建議你先看看 ABC 跟 DEF 有哪些地方不一樣 08/16 22:26
Zoxge:我有個疑問,我都是用vVec.at(i)而不是vVec[i] 08/16 22:26
Zoxge:如果有segmenation fault的話,不是應該會提出警告嗎? 08/16 22:27
Zoxge:我的程式是直接回報segmentation fault,而沒有bac_alloc 08/16 22:28
james732:我的猜測:你的程式是錯在別的地方,跟vector無關 08/16 22:28
james732:不過也只是猜的...XD 08/16 22:28
tropical72:at(i) 失敗是丟 out_of_range 08/16 22:29
Zoxge:ABC和DEF要"一樣"才能以 "ABC(DEF*);" 去配置ABC嗎?? 08/16 22:34
james732:...對不起我錯了,跟兩者的差別沒有關係 orz 08/16 22:35
tropical72:我也推是 shallow copy 耶.. 08/16 22:36
Zoxge:我的也沒有回報 out_of_range 08/16 22:39
Zoxge:請問那要怎麼找出shallow copy的原因呢? 08/16 22:39
Zoxge:我真的沒遇過這種事情 QQ 08/16 22:40
※ 編輯: Zoxge 來自: 123.195.29.203 (08/16 23:19)
aecho:我也覺得應該是別的地方掛了…像是不該被free的卻free掉了? 08/17 06:37
aecho:那個vector只管ptr,實際的alloc和free應該不是它管的。 08/17 06:38