STL::Vector

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;
}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章