【问题标题】:C++ object instance stays on list after being destroyedC++ 对象实例在被销毁后保留在列表中
【发布时间】:2018-04-04 07:26:35
【问题描述】:

我的本​​应是简单的 c++ 代码有点麻烦。

我写了一个类来描述成员(作为社交媒体网络成员),成员有 std::list of follower 和 std::list of follower,两者都是 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 的析构函数被调用,但在 main 函数中,如果我观察 member2 的以下列表和 member1 的追随者列表(均为 Member* 类型),仍然有指向member3 地址,他有一些垃圾值:

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

我的目标是,当 member3 的范围结束时,member2 的以下列表的大小和 member1 的关注者列表的大小将为 0。 有没有办法解决这个问题?

谢谢大家!

【问题讨论】:

  • 在类 Member 中写一个析构函数来执行此操作
  • 您的代码中还有另一个(不相关的)问题:如果您创建两个成员(ID 为 1 和 2),然后销毁第一个成员并创建另一个成员,您将拥有两个 ID 为 2 的成员。我认为这不是你的意图。除非您只销毁最高 ID 的成员,否则此问题总是会发生。如果您只需要唯一的 ID,只需不断增加计数器。如果它们还需要始终保持连续,那就需要更多的努力。
  • 谢谢@MaxLanghof

标签: c++ pointers memory-management


【解决方案1】:

当对象被销毁时,您需要清理followersfollowing 中指向this 的链接。

有点像

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

【讨论】:

  • @Tal 使用调试器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多