【发布时间】: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