代码之家  ›  专栏  ›  技术社区  ›  Tal

C++对象实例被销毁后仍在列表中

  •  1
  • Tal  · 技术社区  · 6 年前

    我的本应是简单的c++代码有点问题。

    我写了一个类来描述一个成员(作为社交媒体网络成员),一个成员有std::关注者列表和std::following列表,这两种类型都是Member*,他可以跟随/不跟随其他成员。

    以下是完整的课程:

    成员H

    class Member {
    private:
        bool isCopy;
        static int counter;
        int id;
        list<Member*> following;
        list<Member*> followers;
    
    public:
        Member();
        Member(const Member &p2);
        ~Member();
        void follow(Member &member);
        void unfollow(Member &member);
        int numFollowers();
        int numFollowing();
        static int count();
        bool operator==(const Member &other) const;
        bool operator!=(const Member &other) const;
    };
    

    成员cpp公司

    int Member::counter = 0;
    
    
    Member::Member()
    {
        counter++;
        id = counter;
        isCopy = false;
        cout << "Constructor ID: " << id << endl;
    }
    
    Member::Member(const Member & p2)
    {
        this->id = p2.id;
        isCopy = true;
    }
    
    Member::~Member()
    {
        cout << "Destructor ID: " << this->id << endl;
        if (!isCopy)
        {
            counter--;
        }
    }
    
    void Member::follow(Member &member)
    {
        if (find(following.begin(), following.end(), &member) == following.end()) 
        {
            following.push_back(&member);
            member.followers.push_back(this);
        }
    
    }
    
    void Member::unfollow(Member &member)
    {
        following.remove(&member);
        member.followers.remove(this);
    }
    
    int Member::numFollowers()
    {
        return followers.size();
    }
    
    int Member::numFollowing()
    {
        return following.size();
    }
    
    int Member::count()
    {
        return counter;
    }
    
    bool Member::operator==(const Member & other) const
    {
        return this->id == other.id;
    }
    
    bool Member::operator!=(const Member & other) const
    {
        return this->id != other.id;
    }
    

    下面是一个给我带来一些问题的简单代码:

    Member member1, member2;
    
    int main() {
        test();
    }
    
    void test(){
        Member member3;
        member2.follow(member3);
        member3.follow(member1);
    }
    

    测试函数结束后,我可以看到正在调用member3的析构函数,但在主函数中,如果我查看以下member2列表和member1的followers列表(均为Member*),仍然有指向member3地址的指针,并且其中包含一些垃圾值:

    {0x00aff720 {isCopy=true (204) id=-858993460 following={ size=3302196 } ...}}
    

    我的目标是,当member3的作用域结束时,以下member2列表的大小和member1的followers列表的大小将为0。 有没有办法解决这个问题?

    谢谢大家!

    1 回复  |  直到 6 年前
        1
  •  2
  •   Caleth    6 年前

    您需要清理到的链接 this 在您的 followers following 当一个对象被销毁时。

    类似于

    Member::~Member()
    {
        std::cout << "Destructor ID: " << id << std::endl;
        if (!isCopy)
        {
            counter--;
        }
        std::for_each(followers.begin(), followers.end(), [this](Member * other){ other.following.remove(this); });
        std::for_each(following.begin(), following.end(), [this](Member * other){ other.followers.remove(this); });
    }