定义一个类,这个类有一个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;
}