Pointers 从包含对象的std::列表中删除

Pointers 从包含对象的std::列表中删除,pointers,object,delete-operator,stdlist,Pointers,Object,Delete Operator,Stdlist,我被教导在存储对象时总是使用指针列表,但我开始使用包含对象的列表。所以我想知道如何正确地从列表中删除一个对象 第一个代码示例从指针列表中删除并正常工作,但第二个代码示例在运行时出错。使用对象列表时是否需要使用“删除” using namespace std; struct SomeObject{ SomeObject(int i){ something=i; } int something; }; void main(){ 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;

}
使用名称空间std;
结构对象{
SomeObject(inti){
某物=我;
}
智力的东西;
};
void main(){
列表指针列表;
SomeObject*op=新的SomeObject(2);
指针列表。推回(op);
auto pit=pointerList.begin();
指针列表。擦除(坑);
删除*坑;

之所以会出现错误,是因为
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;
列表指针列表;
SomeObject*op=新的SomeObject(2);
指针列表。推回(op);
auto-pit=pointerList.front();
pointerList.pop_front();
//删除*pit;//错误

非常感谢您的回答!但是(我认为)(*pit)返回指针,而pit本身就是迭代器?我的问题更多的是如何正确删除这两个列表中的对象。(1)语句“delete&oit”完全错误。(2)“delete(*pit)”错误,因为这样您就不能使用(**pit)(3)像您在示例中那样使用“擦除”将删除列表中的对象,但据我所知,当项目位于列表前面时,这不是惯用用法。在这种情况下,我们使用“pop_front”。