2012-06-01 25 views
1

我正在通過new創建一個對象,然後稍後將對象添加到std :: list列表中。如何從std :: list中正確刪除指針?

刪除指針並從列表中刪除數據而不導致內存泄漏的正確方法是什麼?

+1

不,你應該使用智能指針。 –

+1

'm_DataList'的類型是什麼? –

+6

「while」行中是否有額外的';'出現錯字,還是故意的?如果是故意的,那麼你有問題。 –

回答

4

代替人工循環搜索的元素,我寧願用std::find_if

auto it = std::find_if(lst.begin(), 
         lst.end(), 
         [&val](datalist const &d) { return d.index == val; }); 

if (it != lst.end()) 
{ 
    delete *it; 
    lst.erase(it); 
} 

這並不是說你沒有正確地這樣做。

但是,如果您考慮使用某種形式的智能點,例如std::unique_ptrstd::shared_ptr或boost的智能指針,那麼您的代碼將會得到改進,那麼您不必親自管理內存。

3

如果您改變std::list持有datalist實例,而不是datalist*指針,那麼你不必deletedatalist實例手動了。當您從std::list(或任何其他STL容器)中刪除元素時,元素的數據會自動爲您自動釋放。如果元素是一個定義了析構函數的類/結構體,則會調用析構函數。

試試這個:

std::list<datalist> m_DataList; 

datalist AR; // <-- local variable on the stack, freed when out of scope 
AR.index = ...; 
AR.number = ...; 
mylist.push_back(AR); // <-- pushes a copy-constructed instance of the variable 

std::list<datalist>::iterator Iter1 = m_DataList.begin(); 
while(Iter1 != m_DataList.end()) 
{ 
    if (Iter1->index == m_SomeVar)  
    { 
     m_DataList.erase(Iter1); // <-- copied datalist instance is freed automatically 
     break; 
    } 

    ++Iter1; 
}