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 }

 

posted @ 2016-04-28 14:52  huapyuan  阅读(132)  评论(0编辑  收藏  举报