如何正确处理包含指针的容器是值得探究的。
一、常见的方式,直接手动delete
void doSomething()
{
vector<Widget*> vwp;
for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
vwp.push_back(new Widget);
...
for (vector<Widget*>::iterator i = vwp.begin();i != vwp.end(),++i) {
delete *i;
}
}
二、使用 函数对象+模板的技巧
struct DeleteObject { // 删除这里的
// 模板化和基类
template<typename T> // 模板化加在这里
void operator()(const T* ptr) const {
delete ptr;
}
}
void doSomething()
{
deque<SpecialString*> dssp;
...
for_each(dssp.begin(), dssp.end(),DeleteObject()); // 啊!良好定义的行为!
} //但不是异常安全的
三、 利用Boost的shared_ptr
void doSomething()
{
typedef boost::shared_ ptr<Widget> SPW; //SPW = "shared_ptr to Widget"
vector<SPW> vwp;
for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
vwp.push_back(SPW(new Widget)); // 从一个Widget建立SPW,
// 然后进行一次push_back
... // 使用vwp
} // 这里没有Widget泄漏,甚至
// 在上面代码中抛出异常