std::vector::erase

#
# vector
# 20060629 by daineng@nj.cpsecure
#

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) ;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值