对包含指针的容器使用remove要特别小心
2016-08-08 15:21
246 查看
#include <iostream> #include <algorithm> #include <map> #include <iterator> #include <functional> #include <sstream> #include <vector> using namespace std; class Widget { private: int weight; public: Widget() { }; Widget(int val); Widget& operator=(int val); friend ostream& operator<<(ostream &os,Widget w); bool isCertified(); }; Widget::Widget(int val) { weight=val; } Widget& Widget::operator=(int val) { this->weight=val; return *this; } ostream& operator<<(ostream &os,Widget w) { os<<w.weight; return os; } bool Widget::isCertified() { return this->weight>=10; } class Derefence { public: template<typename T> const T& operator()(const T *w) { return *w; } }; void delAndNullifyUncertified(Widget* &w) { if(!w->isCertified()) { delete w; w=nullptr; } } int main() { vector<Widget*> vec; for(int i=1;i<=10;i++) { vec.push_back(new Widget(2*i+1)); } //涉及到指针的erase-remove可能会造成内存泄漏 //vec.erase(remove_if(vec.begin(),vec.end(),not1(mem_fun(&Widget::isCertified))),vec.end()); //先删除不合格的数据,把指针置空 for_each(vec.begin(),vec.end(),delAndNullifyUncertified); vec.erase(remove(vec.begin(),vec.end(),static_cast<Widget*>(0)),vec.end()); transform(vec.begin(),vec.end(),ostream_iterator<Widget>(cout," "),Derefence()); return 0; }
相关文章推荐
- effective stl 第33条:对包含指针的容器使用remove这一类算法时要特别小心
- 条款33:提防在指针的容器上使用类似remove的算法
- 避免在指针的容器上使用类似remove的算法造成的内存泄漏
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- (转)关于C++中函数指针的使用(包含对typedef用法的讨论)
- 迭代器失效(1)-小心使用STL容器的erase()
- 条款7:当使用new得指针的容器时,记得在销毁容器前delete那些指针
- 使用指针容器后请销毁指针
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
- EF5+MVC4系列(5) 删除的方法 1:系统推荐的先查询后remove删除的方法 2:自己new一个包含主键的类,然后 attach附加 remove删除;3:使用db.Entry 修改状态删除4:EntityState的几种状态
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 使用boost容器指针
- 在ie6下remove包含iframe的table所在的容器,会导致页面控件的焦点诡异丢失。
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- 关于C++中函数指针的使用(包含对typedef用法的讨论)
- boost库的智能指针shared_ptr结合容器vector的使用