2013-03-22 41 views
0

在以下代碼mKnownRSList的類型爲:std :: vector擦除 - 是否自動取消分配?

std::vector<RSAddress *> 

其中RSAddress是I類寫到。功能removeItem從此矢量中刪除項目。

我在這裏的問題是,在調用mKnownRSList上的擦除函數之後,我是否應該取消分配由std :: remove_if返回的迭代器指向的地址。目前,我明確地對名爲last的取消引用迭代器發出刪除調用。你認爲這種方法是正確的嗎?謝謝。

void 
ABC::removeItem(RSAddress * rsAddr) 
{ 
    auto last = 
    std::remove_if(mKnownRSList.begin(), 
        mKnownRSList.end(), 
       [rsAddr](RSAddress * o) 
       { 
        return (*o == *rsAddr); 
       }); 

mKnownRSList.erase(last, mKnownRSList.end()); 

delete *last; 
} 

回答

3

您應該刪除什麼是指向你的指針容器第一內,然後刪除/擦除從容器中實際的指針。

你在這裏做的是解引用一個指向不再存在的東西的迭代器。

1

你覺得這種做法是正確的嗎?

都能跟得上。正確的方法是使用smart_pointers,如shared_ptr。如果你願意,那麼你應該只有erase吧。這樣

std::vector< std::shared_ptr<RSAddress> > mKnownRSList; 
... 

mKnownRSList.erase(std::remove_if(mKnownRSList.begin(), 
            mKnownRSList.end(), 
            [rsAddr](const std::shared_ptr<RSAddress> & o) 
            { 
             return (*o == *rsAddr); 
            }), 
        mKnownRSList.end() 
); 
+0

我會第二borisbn。這是最安全的方法。 – Arun 2013-03-22 12:02:53

相關問題