share_ptr循环引用

2024-07-07 08:52:08 浏览数 (2)

定义一个类,这个类有一个share指针变量,创建一个share指针指向这个类实例,然后将类实例的成员变量share指针也指向这个类实例

代码语言:javascript复制
#include <iostream>
#include <memory>

class Node {
public:
    std::shared_ptr<Node>p;
};

int main() {
    std::shared_ptr<Node>node(new Node());
    node->p=node;
    std::cout<<node.use_count();
    return 0;
}

此时这两个share指针的引用计数都是2,当node超过生命周期被析构时,node的引用计数变成1,不为0,那么node指向的类实例不会被析构,注意智能指针也是一个类,智能指针的析构和它指向的类实例的析构是两回事,程序中Node实例没有被析构导致p也不会析构

用weak指针解决循环引用问题,weak只引用资源不增加资源引用的计数

代码语言:javascript复制
#include <iostream>
#include <memory>

class Node {
public:
    std::weak_ptr<Node>p;
};

int main() {
    std::shared_ptr<Node>node(new Node());
    node->p=node;
    std::cout<<node.use_count();
    return 0;
}

0 人点赞