2013-08-04 57 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