std::vector::erase

#
# vector
# 20060629 by [email protected]
#

vector::erase(iterator) 的返回值代表什麼,這個操作是否可能引起內存泄露

# 無論是調用前保存iterator還是接受調用後的返回之,這個iterator
# 指向的是這個位置上的對象,也是調用前iterator的下一個對象
#
# 調用前iterator指向的對象被丟失,在程序結束時也沒有析構
#
# 但調用erase之前delete iterator會引起錯誤,iterator並不是指針,雖然
# 在某些版本的實作中被定義爲指針

# erase()內部使用copy()來移動空出的slot,這實際上是一個memcpy,
# iterator指向的位置上的內容被覆蓋,這就是無論引用、指針、迭代子
# 都指向/是調用前iterator後面的那個對象的原因
#
# 因爲覆蓋,所以被覆蓋的對象沒有調用析構函數
#
# 如果是一個複雜的對象,new了一塊內存,很明顯這樣的操作會引起
# 內存泄漏
#
# 解決方法是在erase之前把對象拷貝出來(拷貝必須是淺拷貝),藉着
# 拷貝出的對象的析構完成所有內存的釋放

# 舉一個實際的例子,如果vector中保存的是new出來的指針,那麼erase
# 之前需要做delete

delete vec[i] ;  // vector <int*> vec
vec.erase(vec.begin() + i) ;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章