什么是 "健康 "的方式来处理从列表中删除指向对象的指针?

问题描述 投票:0回答:1

假设我们有一个 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 然后 "成为 "列表中的一个元素,因此是一个存在且没有被删除的指针。

我知道我可能在处理刚刚删除的指针时做错了什么.我到底漏掉了什么?

c++ list pointers
1个回答
0
投票

问题是 buyersList() 通过值而不是通过引用返回。

© www.soinside.com 2019 - 2024. All rights reserved.