Effective STL(第7条)
第7条:如果容器中包含了通过new操作创建的指针,切忌在容器对象析构前将指针delete掉
1 //向一个vector中添加多个new出来的对象 2 void doSomething(){ 3 vector<Widget*> vwp; 4 for(int i = 0; i < SOME_MAGIC_NUMBER;++i) 5 vwp.push_back(new Widget); 6 ... 7 } 8 //删除vector中的对象 9 void doSomething(){ 10 vector<Widget*> vwp; 11 ... 12 for(vector<Widget*>::iterator i = vwp.begin(); i!= vwp.end(); ++i) 13 delete *i; 14 }
两个问题:
1. for循环可以用for_each来替代,因为它的表达更清晰
2. 代码不是异常安全。如果在添加或删除的过程中有异常抛出,则会发生资源泄漏。
改进:用智能指针(被引用计数的指针)容器代替指针容器
1 void doSomething(){ 2 typedef boost::shared_ptr<Widget> SPW;//SPW 指向Widget的shared_ptr 3 vector<SPW> vwp; 4 for(int i = 0; i <SOME_MAGIC_NUMBER; ++i) 5 vwp.push_back(SPW(new Widget)); 6 ... 7 }