C 对象实例被销毁后留在列表上

C++ object instance stays on list after being destroyed

本文关键字:列表 对象 实例      更新时间:2023-10-16

我应该对我的简单C 代码遇到一些麻烦。

我已经写了一堂课来描述成员(作为社交媒体网络成员(,成员具有std :: clossers of Plasters and std ::以下列表,clate of type 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);
}

测试函数结束后,我可以看到构成3的驱动器被调用,但是在主功能中,如果我观看以下Member2的列表和Member1的关注者列表(type Member*(仍然有指向成员3地址,他有一些垃圾值:

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

我的目标是,当Member3的范围结束时,以下Member2列表的大小以及Member1的关注者列表的大小为0。有什么方法可以解决这个问题?

谢谢大家!

当对象被破坏时,您需要清理followersfollowingthis的链接。

之类的东西
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); });
}