2015-12-13 82 views
0

下面是用於說明我的問題的相同的C++代碼
我知道其他工作方法,但有興趣知道下面的代碼是否錯誤?用指針刪除列表也是必須清除的對象

Void pupulatelist() 
{ 
    //populating the list with some int pointers,in actual i have some other objects to delete when accessed each time. 
    for(int i =0;i<5;i++) 
    { 
     int *p = new int(i); 
     list.push_back(p); 
    } 
    //want to delete and erase the contents of the above list 
    // if i dont use erase my actual code is crashing. 

    for(std::list<int *>::iterator iter = list.begin(); iter != list.end(); ++iter) 
    { 
     delete(*iter);  
     list.erase(iter--); 
    } 
} 
+1

取消'list.erase'並在循環之後調用'list.clear'。 (另外,請不要使用類型名稱作爲變量名稱。) – molbdnilo

回答

2

所以,很簡單離開list.erase出你的for循環並調用list.clear當你全部完成。

如果你想保留for循環,它需要被修復。它應該是這樣的:

for (auto iter = list.begin(); iter != list.end();) { 
    delete *iter; 
    iter = list.erase(iter); 
} 

erase返回一個迭代的元素之後即刪除,這樣你就不需要在循環遞增一個。此外,您的原始循環會減少iter以指向未定義行爲(UB)的列表開始之前。

+0

嗨,我已經更新了代碼,請您檢查一下,並告訴我它是否仍然存在問題。如果我沒有錯,只是刪除指針將不會清除對象。所以我刪除對象並清除它。 –

+0

@lokeshkondi您在擦除時沒有正確處理迭代器;再次檢查我的代碼。既然你擺脫了一切,你最好不要在循環中擦除,並在循環完成時調用'clear'。 – 1201ProgramAlarm