c++循环引用解决

#include <iostream>
#include <vector>
#include <memory>
class parent;
class children;

class parent
{
public:
    ~parent() { std::cout << "~parent()" << std::endl; }

public:
    std::shared_ptr<children> child;
};

class children
{
public:
    ~children() { std::cout << "~children()" << std::endl; }

public:
    std::shared_ptr<parent> parent;
};

void Verify()
{
    std::shared_ptr<parent> p(new parent);
    std::shared_ptr<children> c(new children);

    p->child = c;
    c->parent = p;
    // p->child.reset(); 手动打破循环
}

int main()
{
    std::cout << "Begin" << std::endl;
    Verify();
    std::cout << "Done" << std::endl;
}

上述代码中,parent有一个shared_ ptr类型的成员指向孩子,而child也有一个shared_ ptr
类型的成员指向父亲。然后在创建孩子和父亲对象时也使用了智能指针c和p,随后将c和p分
别又赋值给child的智能指针成员parent和parent的智能指针成员child.从而形成了一个循
环引用:

解决方法1 手动打破循环

当我们想要parent对象释放时,children对象中仍保留了该parent对象的shared_ptr,导致其无法被正常释放。
既然是因为children对象保留了引用,那么就先释放children对象呗?同理先手动reset()parent也行



使用weak_ptr

为了解决循环引用导致的内存泄漏,引入了weak_ ptr 弱指针,weak_ ptr的构造函数不会修
改引用计数的值,从而不会对对象的内存进行管理,其类似-一个普通指针,但不指向引用计数的
共享内存,但是其可以检测到所管理的对象是否已经被释放,从而避免非法访问。
就是用weak_ptr打破循环

参考链接https://blog.csdn.net/sai_j/article/details/82908241?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%BE%AA%E7%8E%AF%E5%BC%95%E7%94%A8&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-82908241.142v9control,157v4control&spm=1018.2226.3001.4187

posted @ 2022-04-20 15:08  warmhearthhh  阅读(168)  评论(0编辑  收藏  举报