假设我们有一个 Buyer
类。
Buyer
有一个 email
数据成员和 getEmail()
成员函数。
此外,我们还有一个像下面这样的方法,可以删除一个指向 Buyer
对象的指针列表中的 Buyer
对象
void removeBuyer(Buyer* b){
list<Buyer*> :: iterator z;
for(z = buyersList.begin(); z != buyersList.end(); ){//buyersList is the list of pointers to Buyer objects
if( (*z)->getEmail() == b->getEmail() ){
z = buyersList.erase(z);
}
else
++z;
}
那么,假设我尝试用 "登录 "的方式,用 Buyer
对象的指针,我刚刚删除了它。
void logIn{
cout<<"Give email"<<endl;
std::string e;
std::cin>>e;
list <Buyer*> :: iterator it;
for(it = buyersList().begin(); it != buyersList().end(); ++it){
if (e == (*it)->getEmail() ){// This is where the crash eventually occurs
//something
}
}
}
这有时可以正常工作,而其他时候则会出现崩溃的情况。0xC0000005
返回。
我知道 buyersList
(内 logIn
)被更新,并持有所有的指针减去被删除的指针。而当我对迭代器进行dereference时。it
, it
然后 "成为 "列表中的一个元素,因此是一个存在且没有被删除的指针。
我知道我可能在处理刚刚删除的指针时做错了什么.我到底漏掉了什么?
问题是 buyersList()
通过值而不是通过引用返回。