作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] vector因為capacity改變而產生的segmen …
時間Tue Aug 16 23:56:25 2011
※ 引述《Zoxge (Zoxge)》之銘言:
: : 另外 setOS 的參數吃的是 ABC*
: : 但你給他的會是 ABC**
: : 同樣的
: : &(vVec.at(i)) 的型別為 ABC**
: : 感覺 vVec 似乎應該是 vector<ABC>
: : 如果真的是這樣
: : 那你的麻煩就很大了
: : 因為你在塞資料進 vector 時會產生 reallocation
: : 所以用 &(vVec.at(i)) 取得的位址會失效
: reallocaton是什麼??
就是當 capacity 不夠用的時候
vector 會配置新的空間,把舊的資料 copy 過去
然後把舊的空間釋放
: 那為什麼我在另外添加元素使capacity改變之前,資料存取都不會有問題呢?
想一下當你配置新的空間並且把成員移過去後
這些成員的位址全部都改變了
但你之前用 setOS(&(vVec.at(i))) 所加入的
是舊的位址,它所在的空間已經還給系統
再去使用的話當然會出問題
: : 即便不是如此
: : ABC 這個 class 的結構也太異常了
: 異常是指??
ABC 底下有兩個陣列 包含 ABC*
看起來這像是一個樹狀結構
但又發現這顆樹的 interior node 還會互相指來指去
如果 ABC 都是動態配置
我相當好奇你如何確保記憶體可以正確釋放
: : 就算沒這個 bug 也一定會有其它 bug 的
: : 建議你把這個 class 中的功能儘量獨立出來
: : 否則這種複雜的結構會讓你 debug 超級痛苦
: 功能獨立出來是指不要用 繼承 或 多型 嗎??
讓 class 的功能單一、明確
不過因為我不知道這份code的實際用途,所以也很難給具體建議就是了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.78.231
→ firejox:這我想到埃及分數 沒有寬度 沒有深度XDD 08/17 00:10
→ firejox:不過老實說 如果沒有說明清楚ABC的結構也是徒然... 08/17 00:23
推 Zoxge:嗯 謝謝你提醒了我這點 08/17 09:24