C语言 智能指针 shared_ptr 和 weak_ptr

C语言 智能指针 shared_ptr 和 weak_ptr

weak_ptr引入可以解决shared_ptr交叉引用时无法释放资源的问题。

示例代码:

#include <iostream> #include <memory> using namespace std; class B; class A{ public:     A(){cout << "A constructor ... "<< endl;}     ~A(){cout << "A destructor ..." << endl;}     std::shared_ptr<B> pb; }; class B{ public:     B(){cout << "B constructor ... "<< endl;}     ~B(){cout << "B destructor ..." << endl;}     std::shared_ptr<A> pa; }; int main(int argc, char **argv) {     std::shared_ptr<int> a = std::make_shared<int>(3);     std::shared_ptr<char> b = std::make_shared<char>('a');     std::cout << "shared_ptr object(int) size = " << sizeof(a) << std::endl;     std::cout << "shared_ptr object(char) size = " << sizeof(b) << std::endl;     std::weak_ptr<A> shadow_a;     std::weak_ptr<B> shadow_b;     {     std::shared_ptr<A> ptr_a = std::make_shared<A>();     std::shared_ptr<B> ptr_b = std::make_shared<B>();     shadow_a = ptr_a;     shadow_b = ptr_b;     ptr_a->pb = ptr_b;     ptr_b->pa = ptr_a;     cout << "reference count of A = " << shadow_a.use_count() << endl;     cout << "reference count of B = " << shadow_b.use_count() << endl;     cout << endl;      }     cout << "reference count of A = " << shadow_a.use_count() << endl;     cout << "reference count of B = " << shadow_b.use_count() << endl;     std::cout << "Hello, world!" << std::endl;     return 0; }

运行代码得到以下输出:

shared_ptr object(int) size = 16
shared_ptr object(char) size = 16
A constructor ... 
B constructor ... 
reference count of A = 2
reference count of B = 2

reference count of A = 1
reference count of B = 1
Hello, world!

从结果可以看出,由于交叉引用导致申请的内存A,B无法正常释放。
为什么会这样呢?这个应该从析构原理进行考虑,shared_ptr引用计数需要为0才会进行析构!但是ptr_a离开作用域会导致A引用计数减少1,但是A的引用计数此时为1,那么 pb不会释放;同理,ptr_b离开作用域会导致B引用计数减少1,但是B的引用计数为此时为1,那么pa不会释放。如此导致了资源无法释放掉。
由于weak_ptr并不会改变shared_ptr的引用计数,所以修改类A,和类B中的shared_ptr对象为weak_ptr对象即可释放资源。

修改后的代码如下:

#include <iostream> #include <memory> using namespace std; class B; class A{ public:     A(){cout << "A constructor ... "<< endl;}     ~A(){cout << "A destructor ..." << endl;}     //std::shared_ptr<B> pb;     std::weak_ptr<B> pb; }; class B{ public:     B(){cout << "B constructor ... "<< endl;}     ~B(){cout << "B destructor ..." << endl;}     //std::shared_ptr<A> pa;     std::weak_ptr<A> pa; }; int main(int argc, char **argv) {     std::shared_ptr<int> a = std::make_shared<int>(3);     std::shared_ptr<char> b = std::make_shared<char>('a');     std::cout << "shared_ptr object(int) size = " << sizeof(a) << std::endl;     std::cout << "shared_ptr object(char) size = " << sizeof(b) << std::endl;     std::weak_ptr<A> shadow_a;     std::weak_ptr<B> shadow_b;     {     std::shared_ptr<A> ptr_a = std::make_shared<A>();     std::shared_ptr<B> ptr_b = std::make_shared<B>();     shadow_a = ptr_a;     shadow_b = ptr_b;     ptr_a->pb = ptr_b;     ptr_b->pa = ptr_a;     cout << "reference count of A = " << shadow_a.use_count() << endl;     cout << "reference count of B = " << shadow_b.use_count() << endl;     cout << endl;      }     cout << "reference count of A = " << shadow_a.use_count() << endl;     cout << "reference count of B = " << shadow_b.use_count() << endl;     std::cout << "Hello, world!" << std::endl;     return 0; }

运行结果如下,可以正常释放资源。

shared_ptr object(int) size = 16
shared_ptr object(char) size = 16
A constructor ... 
B constructor ... 
reference count of A = 1
reference count of B = 1

B destructor ...
A destructor ...
reference count of A = 0
reference count of B = 0
Hello, world!

到此这篇关于C语言 智能指针 shared_ptr 和 weak_ptr的文章就介绍到这了,更多相关 shared_ptr 和 weak_ptr内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    探探语言设置|探探怎么设置语言

    探探语言设置|探探怎么设置语言,,1. 探探怎么设置语言打开探探软件,然后就有消息提示的红点,点开就行了!其实这些软件都是挺简单的操作的,都是

    git设置编码|git语言设置

    git设置编码|git语言设置,,git设置编码点击cap4j搜索从git直接链接上拉代码。git语言设置Git是一个开源的分布式版本控制系统,可以有效、高

    区域语言设置|区域语言设置工具

    区域语言设置|区域语言设置工具,,区域语言设置工具你好,大致的方法如下,可以参考:1、按下键盘的windows 图标,再开始菜单中单击“设置”;出现的

    c4d语言设置|c4d汉语设置

    c4d语言设置|c4d汉语设置,,1. c4d汉语设置mac版的C4D是这样的,中文字体是有的,但是是以拼音的形式存在,比如黑体就是ht。中文字体以拼音方式

    电脑宣传语|电脑宣传语言

    电脑宣传语|电脑宣传语言,,1. 电脑宣传语言1.我做好了与你过一辈子的打算,也做好了你随时要走的准备,2.每段青春都会苍老,但我希望记忆里的你

    office语言设置|微软office语言设置

    office语言设置|微软office语言设置,,微软office语言设置一、首先点击桌面左下角“WIN键”。二、弹出选项内点击“所有程序”。三、接着点

    小米设置日语|小米设置日语语言

    小米设置日语|小米设置日语语言,,1. 小米设置日语语言MIUI系统文字目前只支持简体中文、繁体中文、英文、藏文和维吾尔文,不支持日文 2. 小