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