[問題] vector因為capacity改變而產生的segmen …
開發平台(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)的情形
我在setOS與setIS時,都是用類似的方法去存資料的
全部的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
08/16 21:15, 1F
※ 編輯: Zoxge 來自: 123.195.29.203 (08/16 21:16)
→
08/16 21:16, , 2F
08/16 21:16, 2F
→
08/16 21:34, , 3F
08/16 21:34, 3F
→
08/16 21:35, , 4F
08/16 21:35, 4F
推
08/16 21:39, , 5F
08/16 21:39, 5F
→
08/16 21:45, , 6F
08/16 21:45, 6F
→
08/16 21:46, , 7F
08/16 21:46, 7F
→
08/16 21:50, , 8F
08/16 21:50, 8F
→
08/16 21:53, , 9F
08/16 21:53, 9F
→
08/16 21:57, , 10F
08/16 21:57, 10F
→
08/16 21:57, , 11F
08/16 21:57, 11F
→
08/16 22:00, , 12F
08/16 22:00, 12F
→
08/16 22:04, , 13F
08/16 22:04, 13F
推
08/16 22:07, , 14F
08/16 22:07, 14F
→
08/16 22:13, , 15F
08/16 22:13, 15F
推
08/16 22:13, , 16F
08/16 22:13, 16F
→
08/16 22:14, , 17F
08/16 22:14, 17F
→
08/16 22:14, , 18F
08/16 22:14, 18F
推
08/16 22:17, , 19F
08/16 22:17, 19F
→
08/16 22:18, , 20F
08/16 22:18, 20F
→
08/16 22:18, , 21F
08/16 22:18, 21F
→
08/16 22:18, , 22F
08/16 22:18, 22F
→
08/16 22:19, , 23F
08/16 22:19, 23F
→
08/16 22:24, , 24F
08/16 22:24, 24F
→
08/16 22:24, , 25F
08/16 22:24, 25F
→
08/16 22:25, , 26F
08/16 22:25, 26F
→
08/16 22:25, , 27F
08/16 22:25, 27F
→
08/16 22:26, , 28F
08/16 22:26, 28F
→
08/16 22:26, , 29F
08/16 22:26, 29F
→
08/16 22:27, , 30F
08/16 22:27, 30F
→
08/16 22:28, , 31F
08/16 22:28, 31F
→
08/16 22:28, , 32F
08/16 22:28, 32F
→
08/16 22:28, , 33F
08/16 22:28, 33F
→
08/16 22:29, , 34F
08/16 22:29, 34F
→
08/16 22:34, , 35F
08/16 22:34, 35F
→
08/16 22:35, , 36F
08/16 22:35, 36F
→
08/16 22:36, , 37F
08/16 22:36, 37F
→
08/16 22:39, , 38F
08/16 22:39, 38F
→
08/16 22:39, , 39F
08/16 22:39, 39F
→
08/16 22:40, , 40F
08/16 22:40, 40F
※ 編輯: Zoxge 來自: 123.195.29.203 (08/16 23:19)
推
08/17 06:37, , 41F
08/17 06:37, 41F
→
08/17 06:38, , 42F
08/17 06:38, 42F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章