vector::pop_back,错误延迟发生
2010-03-02 12:10
190 查看
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
作者: 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
相关文章推荐
- 一个空的vector执行pop_back操作会发生什么?
- 使用vector::push_back时,Release模式发生错误void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
- 【吃一堑】vector的pop_back使用错误造成的core dump
- 延迟加载时发生no session错误的解决办法
- vector::clear()和vecotr::pop_back()对内存处理的不同 http://blog.csdn.net/vieri_ch/article/details/1191390
- vector删除元素之pop_back(),erase(),remove()
- perl pop和push函数,不使用索引更能利用perl的特性,减少边界值错误发生的几率
- vector::clear()和vecotr::pop_back()对内存处理的不同 http://blog.csdn.net/vieri_ch/article/details/1191390
- C++ primer 当vector中的push_back遇到移动构造函数会发生什么
- 删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法
- struct中包含vector<int>时,push_back的时候出现内存错误
- vector 的删除操作pop_back、erase效率对比 http://blog.csdn.net/efeics/article/details/8059690
- 删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法http://www.xuebuyuan.com/1407838.html
- vector::clear()和vecotr::pop_back()对内存处理的不同
- c++ vector push_back 出错或者错误
- 【DEBUG笔记】VTK中使用std::vector时报指针错误“读取位置xxx时发生访问冲突”
- c++在遍历vector数组的时候,发生的传出引用的错误,特别记录一下
- vector::clear()和vecotr::pop_back()对内存处理的不同
- 删除vector容器中的对象元素的三种方法:pop_back, erase与remove算法
- vector 的删除操作pop_back、erase效率对比