我一直被教导在存储对象时总是使用指针列表,但我开始使用包含对象的列表。所以我想知道如何从列表中正确删除对象?
第一个代码示例从指针列表中删除并且可以正常工作,但第二个代码示例在运行时出错。使用包含对象的列表时是否需要使用删除?
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;
}
这样做也有什么好处和好处?
答案 0 :(得分: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;