What is the "healthy" way to handle deletion of pointers to objects from a list?


Let's say we have a Buyer class.

Buyer has an email data member and a getEmail() member function.

Also we have a method like the one below that deletes a pointer to Buyer objects from a list of pointers to Buyer objects

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); 

Then let's say I try to "log in" with the Buyer object whose pointer I just deleted.

void logIn{
    cout<<"Give email"<<endl;
    std::string e;
    list <Buyer*> :: iterator it;
    for(it = buyersList().begin(); it != buyersList().end(); ++it){
        if (e == (*it)->getEmail() ){// This is where the crash eventually occurs

This sometimes works fine, others a crash occurs with the 0xC0000005 return.

I know that the buyersList (inside logIn) is updated and holds all the pointers minus the deleted one. And when I dereference the iterator it, it then "becomes" one of the elements of the list, hence a pointer that exists and is not deleted.

I know that I'm probably doing something wrong with the handling of the pointer I just deleted. What am I missing exactly?

asked on Stack Overflow May 24, 2020 by Andreas Kostas

1 Answer


The issue was that buyersList() returned by value and not by reference.

answered on Stack Overflow May 24, 2020 by Andreas Kostas

User contributions licensed under CC BY-SA 3.0