2013-08-04 91 views
0

我被教導總是在存儲對象時使用指針列表,但是我開始使用列表中的對象來代替它們。所以我想知道如何正確地從列表中刪除一個對象?使用對象從std :: list中刪除

第一個代碼示例從指針列表中刪除並正常工作,但第二個代碼示例在運行時發生錯誤。使用對象列表處理時,是否需要使用刪除?

using namespace std; 

struct SomeObject{ 
    SomeObject(int i){ 
     something=i; 
    } 
    int something; 
}; 

void main(){ 



    list<SomeObject*> pointerList; 
    SomeObject * op = new SomeObject(2); 
    pointerList.push_back(op); 

    auto pit = pointerList.begin(); 
    pointerList.erase(pit); 
    delete *pit; 

    cout<<(**pit).something<<endl; 



    list<SomeObject> objectList; 
    SomeObject o(1); 
    objectList.push_back(o); 

    auto oit = objectList.begin(); 
    objectList.erase(oit); 
    delete &oit;//this one 

    cout<<oit->something<<endl; 



    int i; 
    cin >> i; 

} 

此外,這樣做有什麼下降和上升?

回答

1

你得到的錯誤,因爲oit是一個迭代器,而不是一個指針。您在使用new獲取的指針上使用delete。迭代器看起來像指針,但它們是而不是指針。在你給的例子中,使用delete只是錯誤的。

我認爲這將是更地道這種方式(和正確的!):

list<SomeObject*> pointerList; 
SomeObject * op = new SomeObject(2); 
pointerList.push_back(op); 

auto pit = pointerList.front(); 
pointerList.pop_front(); 
// delete *pit; // wrong 

cout << (**pit).something << endl; 

list<SomeObject> objectList; 
SomeObject o(1); 
objectList.push_back(o); 

auto oit = objectList.front(); 
objectList.pop_front(); 
// delete &oit; // wrong 

cout << oit->something << endl; 
+0

謝謝你的回答!然而(我認爲)(* pit)返回指針而pit是迭代器本身?我的問題更多的是如何正確刪除這兩個列表中的對象。 –

+0

(1)狀態「delete&oit」顯然是錯誤的。 (2)「刪除(*坑)」是錯誤的,因爲你不能使用(**坑)。某些東西,你引用了一個已被刪除的對象。 (3)在你的例子中使用像你一樣的「擦除」會刪除列表中的對象,但據我所知,當項目位於列表的前面時,它不是慣用的。在這種情況下,我們使用「pop_front」。 – zentrunix