class Widget { ... };
typedef vector<Widget> WidgetContainer;
typedef WidgetContainer::iterator WCIterator;
WidgetContainer cw;
Widget bestWidget;
...
WCIterator i = find(cw.begin(), cw.end(), bestWidget);
容器容纳了对象,但不是你给它们的那个对象。此外,当你从容器中获取一个对象时,你所得到的对象不是
容器里的那个对象。取而代之的是,当你向容器中添加一个对象(比如通过insert或push_back等),进入容
器的是你指定的对象的拷贝。拷进去,拷出来。这就是STL的方式。
下面代码直接导致一个内存泄漏:
void doSomething()
{
vector<Widget*> vwp;
for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
vwp.push_back(new Widget);
... // 使用vwp
} // Widgets在这里泄漏
当vwp除了生存域后,vwp的每个元素都被销毁,但那并不改变从没有把delete作用于new得到的对象这个事
实。那样的删除是你的职责,而不是vector的。这是一个特性。只有你知道一个指针是否应该被删除。
void doSomething()
{
vector<Widget*> vwp;
... // 同上
for (vector<Widget*>::iterator i = vwp.begin();
i != vwp.end(),
++i) {
delete *i;
}
}