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