S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

[Reference]vector::pop_back,错误延迟发生

Posted on 2008-11-05 07:57 S.l.e!ep.¢% 阅读(646) 评论(0)  编辑 收藏 引用 所属分类: STL

vector::pop_back,错误延迟发生

作者: Panic  2005年8月5日

pop_back是vector中一个不常用的成员函数,功能是销毁并抛弃vector的最后一个元素。

msdn已经明确要求调用这一函数的vector必须非空。但是如果对空vector调用会发生什么呢?

pop_back调用一般并不会引起程序立刻异常或崩溃,vector只是简单的把存储区前面的一段内存看作一个“元素”,对它调用析构函数,然后尾迭代器向前移动1。

由于存储区的前一段内存一般而言也是有效的,可访问的空间,所以这个操作可能只是修改了不应该修改的数据而已。一般不会立刻发现问题。

那么问题在什么时候发生呢?析构的时候!

析构的时候,vector销毁首元素,然后增加首迭代器直到它等于尾。但是由于前面的pop_back,尾迭代器位置前移,在最开始就已经等于甚者小于首。所以这个移动其实是对后面内存空间的一次大清理。程序会因此长时间失去响应。

而当vector是一个临时变量(栈对象)的时候,因为栈对象清理的工作是在后台操作,所以在我们看来往往是函数退出的时候突然死掉了。

因为错误发生的地点和检查到错误的地点相隔比较远,所以这无疑是一个比较难找的错误。

解决方法:
方法1,修改vector的实现代码,在pop_back中加入断言。这么做一劳永逸,不过很多人不愿意:P
方法2,调用pop_back前进行断言或者判断。这个完全靠使用者自觉。
方法3,避免在代码中调用pop_back。嗯,好办法--b


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理