Re: [問題] vector因為capacity改變而產生的segmen …
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間14年前 (2011/08/16 23:56)推噓1(1推 0噓 2→)留言3則, 2人參與討論串4/5 (看更多)
※ 引述《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
→
08/17 00:10, , 1F
08/17 00:10, 1F
→
08/17 00:23, , 2F
08/17 00:23, 2F
推
08/17 09:24, , 3F
08/17 09:24, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 5 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章