C 对象实例被销毁后留在列表上
C++ object instance stays on list after being destroyed
我应该对我的简单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。有什么方法可以解决这个问题?
谢谢大家!
当对象被破坏时,您需要清理followers
和following
中 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); });
}
相关文章:
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 从封装在对象中的函数 C++ 返回时为空的列表
- 如何在不销毁对象的情况下返回对象列表
- 如何使用Q_PROPERTY公开自定义对象列表
- 链接列表在 cpp 中包含不同的对象类
- 如何使用对象制作分数列表并获得平均值
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 我可以从列表中获取对象并复制它们,但如何删除我复制的对象?
- 如何获取列表的每个对象并调用getName方法来打印其名称
- 如何在Windows Media Foundation SDK中指定语言列表对象
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 将类的每个实例添加到列表对象的构造函数
- 列表<对象*>迭代器中的分段错误
- 如何使用list::sort()对STL列表对象进行排序,同时将自定义排序函数作为参数传递给list::排序
- 如何防止客户端修改列表对象
- c++列表对象错误
- 在列表对象中使用对象的派生函数
- 编译器错误 使用列表<对象*的迭代器> C++