0

我被教导在存储对象时总是使用指针列表,但我开始使用其中包含对象的列表。所以我想知道如何正确地从列表中删除一个对象?

第一个代码示例从指针列表中删除并且工作正常,但第二个代码示例在运行时出错。使用带有对象的列表时是否需要使用删除?

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;

}

这样做有什么缺点和好处?

4

1 回答 1

1

你得到错误是因为oit它是一个迭代器,而不是一个指针。您delete在使用new. 迭代器看起来像指针,但它们不是指针。在您给出的示例中,使用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;
于 2013-08-04T12:31:58.683 回答