C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C语言智能指针引用计数

解析c++ 中智能指针引用计数为什么不是0原理

作者:bayes

这篇文章主要为大家介绍了C语言中智能指针引用计数为什么不是0原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题示例1:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    mp.clear();
    mp.clear();
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    return 0;
}

输出:
=100,count=1
=100,count=3
=100,count=1 // 为什么这里引用计数是1而不是0呢?

问题示例2:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    ptr.reset();
    printf("count=%ld\n", ptr.use_count());
    return 0;
}

输出:
=100,count=1
=100,count=3
count=0 //这里为什么是0而不是2呢? 一直理解的 reset()是引用计数减1.

解析

问题1:

ptr 还在,还有一个引用。

问题2:

reset 之后,ptr 的指向改变,引用计数已经不是原来指针的引用计数了。新指针是个 nullptr ,引用计数为 0 。原来的指针引用计数是 2 ,两个引用都在 map 里,已经无法通过 ptr 访问。

可以运行下面代码验证:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    ptr.reset();
    printf("count=%ld\n", ptr.use_count());
    printf("=%d,count=%ld\n", *mp[1].get(), mp[1].use_count());
    printf("=%d,count=%ld\n", *mp[2].get(), mp[2].use_count());
    return 0;
}

输出:

=100,count=1
=100,count=3
count=0
=100,count=2
=100,count=2

函数逻辑

你可以设想一下这个函数的逻辑

void reset() _NOEXCEPT
    {
        shared_ptr().swap(*this);
    }

第一步, 创造一个空shared_ptr对象,与原智能指针交换.交换后指向nullptr,引用为0;

第二步, 原始的指针成了右值, 在语句调用结束消灭, 随即, 原资源引用数减一, 如减为0, 自行消灭,否则继续留存.

 以上就是解析C语言中智能指针引用计数为什么不是0原理的详细内容,更多关于C语言智能指针引用计数的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文